Якщо індекс списку існує, зробіть X


129

У моїй програмі користувач вводить номер n, а потім вводить nкількість рядків, які зберігаються у списку.

Мені потрібно зашифрувати такий код, що якщо певний індекс списку існує, то запустіть функцію.

Це ускладнюється тим, що я вклав, якщо заяви про len(my_list).

Ось спрощена версія того, що я маю зараз, а це не працює:

n = input ("Define number of actors: ")

count = 0

nams = []

while count < n:
    count = count + 1
    print "Define name for actor ", count, ":"
    name = raw_input ()
    nams.append(name)

if nams[2]: #I am trying to say 'if nams[2] exists, do something depending on len(nams)
    if len(nams) > 3:
        do_something
    if len(nams) > 4
        do_something_else

if nams[3]: #etc.

1
Схоже, ви хочете ввести cast nяк ціле число, а не список. Я збентежений.
mVChr

2
Так, реальна проблема тут використовується nзамість namsв ifс
Wooble

У вашому випадку п не є списком. Спочатку перевірте (відкиньте) це ціле число, потім ви можете його повторити чи перерахувати залежно від ефекту, який ви хочете досягти.
звільнений

Так, помилково. Виправлено на nams []
користувач1569317

"те, що у мене є sub, якщо заяви про len (my_list)." Чи замислювались ви про те, що мається на увазі, які індекси списків існують, через те, що lenсписок цього списку має хоча б певне значення?
Карл Кнечтел

Відповіді:


157

Чи може вам бути корисніше використовувати довжину списку, len(n)щоб повідомити про своє рішення, а не перевіряти n[i]кожну можливу довжину?


6
Так. Переглянувши код, моя настройка була зовсім зайвою; len (n) виконала все, що мені потрібно. Дякую за точку в правильному напрямку.
користувач1569317

1
Це не враховує негативних індексів. Найкращий спосіб, який я знаю, - це спробувати / крім IndexError, але було б непогано мати стислий спосіб отримати
Аврам

У Python негативні індекси у списках просто підраховуються від кінця списку. Тому вони не могли існувати таким чином, що впливає на довжину списку.
ДжонатанV

84

Мені потрібно зашифрувати такий код, що якщо певний індекс списку існує, то запустіть функцію.

Це ідеальне використання для пробного блоку :

ar=[1,2,3]

try:
    t=ar[5]
except IndexError:
    print('sorry, no 5')   

# Note: this only is a valid test in this context 
# with absolute (ie, positive) index
# a relative index is only showing you that a value can be returned
# from that relative index from the end of the list...

Однак, за визначенням, всі елементи в списку Python між 0і len(the_list)-1існують (тобто немає потреби в спробі, за винятком випадків, якщо ви знаєте 0 <= index < len(the_list)).

Ви можете використовувати перерахування, якщо потрібно індексувати між 0 і останнім елементом:

names=['barney','fred','dino']

for i, name in enumerate(names):
    print(i + ' ' + name)
    if i in (3,4):
        # do your thing with the index 'i' or value 'name' for each item...

Якщо ви шукаєте якусь певну «індексну» думку, я думаю, ви задаєте неправильне запитання. Можливо, вам слід розглянути можливість використання контейнера для відображення (наприклад, диктату) проти контейнера послідовностей (наприклад, списку). Ви можете переписати свій код так:

def do_something(name):
    print('some thing 1 done with ' + name)

def do_something_else(name):
    print('something 2 done with ' + name)        

def default(name):
    print('nothing done with ' + name)     

something_to_do={  
    3: do_something,        
    4: do_something_else
    }        

n = input ("Define number of actors: ")
count = 0
names = []

for count in range(n):
    print("Define name for actor {}:".format(count+1))
    name = raw_input ()
    names.append(name)

for name in names:
    try:
        something_to_do[len(name)](name)
    except KeyError:
        default(name)

Виконує так:

Define number of actors: 3
Define name for actor 1: bob
Define name for actor 2: tony
Define name for actor 3: alice
some thing 1 done with bob
something 2 done with tony
nothing done with alice

Ви також можете використовувати .get метод, а не спробувати / за винятком більш короткої версії:

>>> something_to_do.get(3, default)('bob')
some thing 1 done with bob
>>> something_to_do.get(22, default)('alice')
nothing done with alice

3
спробувати заблокувати? Я початківець в Python, але це здається великим "ні" в програмуванні ... винятки для контролю потоку? Виняток має бути для речей, які ми не можемо контролювати правильно?
Луїс

3
@Luis Я також початківець в Python, але з того, що я читав, що обробка винятків у цих випадках - це стиль, який Python пропагує, що C / Java / C # немає. Див stackoverflow.com/questions/11360858 / ...
Tinister

Речення «всі індекси у списку Python між 0 та len (list)» абсолютно неправильне. Скажімо, є список x = [1, 2, 3], який len_x = 3. Немає такого індексу, як 3. Речення повинно було бути: "усі індекси в списку Python від 0 до len (список) - 1" .
Ліор Маген

9
@LiorMagen: Ти маєш рацію, і я це відредагував. Це якось суворо вниз проголосувати досить популярним повідомленням за таку педантичну помилку. Досить простого коментаря.
dawg

Я вкажу , що стирчать речі Всередині tryнічого НЕ сказати, якщо індекс існує тільки якщо це fetchable - взяття -1- цей показник на насправді не існує , але значення буде повернуто.
Джордж Мауер

17

len(nams)має бути рівним nу вашому коді. Усі індекси 0 <= i < n"існують".


15

Це можна зробити просто за допомогою наступного коду:

if index < len(my_list):
    print(index, 'exists in the list')
else:
    print(index, "doesn't exist in the list")

6

Мені потрібно зашифрувати такий код, що якщо певний індекс списку існує, то запустіть функцію.

Ви вже знаєте, як перевірити це, і насправді вже виконуєте такі тести у своєму коді .

Дійсні індекси для списку довжини nпроходять 0через n-1включно.

Таким чином, список має індекс i тоді і тільки тоді, коли довжина списку принаймні i + 1.


Так, у мене були інструменти для вирішення моєї проблеми, я просто не застосовував їх чітко. Дякую за точку в правильному напрямку.
користувач1569317

Дякую за це, особливо останнє речення, яке є важливою властивістю списків Python, що відрізняє їх від масивів JavaScript та інших подібних конструкцій.
Роберт

6

Використання довжини списку було б найшвидшим рішенням, щоб перевірити, чи існує індекс:

def index_exists(ls, i):
    return (0 <= i < len(ls)) or (-len(ls) <= i < 0)

Це також перевіряє негативні показники та більшість типів послідовностей (Like rangesі strs), що мають довжину.

Якщо після цього вам потрібно буде отримати доступ до елемента в цьому індексі, простіше просити пробачення, ніж дозволу , а також швидше і пітонічніше. Використовуйте try: except:.

try:
    item = ls[i]
    # Do something with item
except IndexError:
    # Do something without the item

Це було б на відміну від:

if index_exists(ls, i):
    item = ls[i]
    # Do something with item
else:
    # Do something without the item

3

Якщо ви хочете повторити вставлені дані акторів:

for i in range(n):
    if len(nams[i]) > 3:
        do_something
    if len(nams[i]) > 4:
        do_something_else

1

ок, тому я думаю, що це насправді можливо (заради аргументу):

>>> your_list = [5,6,7]
>>> 2 in zip(*enumerate(your_list))[0]
True
>>> 3 in zip(*enumerate(your_list))[0]
False

хоча це було б ще простіше:3 in range(len(your_list)
avloss

1
або навіть це 3 in xrange(len(your_list)- напевно, не може зробити кращого за це
avloss

1

Можна спробувати щось подібне

list = ["a", "b", "C", "d", "e", "f", "r"]

for i in range(0, len(list), 2):
    print list[i]
    if len(list) % 2 == 1 and  i == len(list)-1:
        break
    print list[i+1];

1

Oneliner:

do_X() if len(your_list) > your_index else do_something_else()  

Повний приклад:

In [10]: def do_X(): 
    ...:     print(1) 
    ...:                                                                                                                                                                                                                                      

In [11]: def do_something_else(): 
    ...:     print(2) 
    ...:                                                                                                                                                                                                                                      

In [12]: your_index = 2                                                                                                                                                                                                                       

In [13]: your_list = [1,2,3]                                                                                                                                                                                                                  

In [14]: do_X() if len(your_list) > your_index else do_something_else()                                                                                                                                                                      
1

Просто для інформації. Імхо, try ... except IndexErrorкраще рішення.


-3

Не давайте місця перед дужками.

Приклад:

n = input ()
         ^

Порада. Ви повинні додавати коментарі над та / або під кодом. Не за вашим кодом.


Гарного дня.


Ласкаво просимо до SO! Ваша відповідь виглядає як коментар, а не відповідь. Коли у вас буде достатня репутація, ви зможете коментувати будь-яку публікацію. Перевірте також, що я можу зробити замість цього . Якщо ви мали намір відповісти, прочитайте цю інструкцію щодо відповіді, щоб дотримуватися вказівок SO.
thewaywewere

-3

Дуже багато відповідей, не прості.

Щоб перевірити, чи існує індекс 'id' у словниковому слові:

dic = {}
dic['name'] = "joao"
dic['age']  = "39"

if 'age' in dic

повертає істину, якщо існує вік.


1
Недобра відповідь на запитання. Питання стосувалося списків, а не словників. Те, що ви запропонували, неможливо зробити у таких випадках: ["joao", 39]
Ruhrpottpatriot
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.