Если индекс существует, не Х
в моей программе, пользователь вводит номер n
, а затем входы n
количество строк, которые хранятся в списке.
мне нужно закодировать так, что если существует определенный индекс списка, то запустите функцию.
это усложняется тем, что у меня есть вложенные операторы if о 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.
10 ответов:
может быть более полезно для вас использовать длину списка
len(n)
сообщить ваше решение, а не проверкиn[i]
для каждой возможной длины?
мне нужно закодировать так, что если существует определенный индекс списка, то запустите функцию.
это идеальное использование для попробовать блок:
ar=[1,2,3] try: t=ar[5] except IndexError: print 'sorry, no 5'
однако, по определению, все элементы в списке 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
вы также можете использовать .получить метод, а не попробовать/за исключением короче версия:
>>> something_to_do.get(3, default)('bob') some thing 1 done with bob >>> something_to_do.get(22, default)('alice') nothing done with alice
мне нужно закодировать так, что если существует определенный индекс списка, то запустите функцию.
вы уже знаете, как проверить это и в самом деле уже выполняют такие тесты в вашем коде.
допустимые индексы для списка длины
n
are0
черезn-1
включительно.таким образом, список имеет индекс
i
, если и только если длина списка по крайней мереi + 1
.
использование длины списка было бы самым быстрым решением для проверки наличия индекса:
def index_exists(ls, i): return (0 <= i < len(ls)) or (-len(ls) <= i < 0)
это также проверяет отрицательные индексы и большинство типов последовательностей (например,
ranges
иstr
s), которые имеют длину.Если вам нужно получить доступ к элементу в этом индексе впоследствии в любом случае, это легче просить прощения, чем разрешения, и это также быстрее и более Pythonic. Используйте
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
Если вы хотите повторить вставленные данные актеров:
for i in range(n): if len(nams[i]) > 3: do_something if len(nams[i]) > 4: do_something_else
Это можно сделать просто с помощью следующего кода:
if index < len(my_list): print(index, ' exists in the list') else: print(index, " doesn't exist in the list")
ок, так я думаю, что это действительно возможно (ради аргумента):
>>> your_list = [5,6,7] >>> 2 in zip(*enumerate(your_list))[0] True >>> 3 in zip(*enumerate(your_list))[0] False