Якщо індекс списку існує, зробіть 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.