Если индекс списка существует, выполните X

129

В моей программе пользователь вводит число n, а затем вводит nколичество строк, которые сохраняются в списке.

Мне нужно написать такой код, чтобы, если существует определенный индекс списка, запустить функцию.

Это усложняется тем фактом, что я вложил операторы if about 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.
user1569317
источник
1
Похоже, вы хотите ввести приведение nкак целое число, а не как список. Я запутался.
mVChr 02
2
Да, реальная проблема здесь используется nвместо namsв ifс
Wooble
В вашем случае n - это не список. Сначала проверьте (приведите) его как целое число, затем вы можете перебирать или перечислять в зависимости от эффекта, которого хотите достичь.
непринужденный
Ага, опечатка. Исправлено в nams []
user1569317 02
"тот факт, что у меня есть sub if утверждения о len (my_list)." Задумывались ли вы о том, что подразумевается в отношении того, какие индексы списка существуют, исходя из того факта, что lenсписок имеет по крайней мере определенное значение?
Карл Кнехтель

Ответы:

157

Может ли вам быть более полезным использовать длину списка len(n)для обоснования своего решения, а не проверять n[i]каждую возможную длину?

JonathanV
источник
6
Ага. После просмотра кода моя настройка оказалась совершенно лишней; len (n) выполнил все, что мне нужно. Спасибо за точку в правильном направлении.
user1569317 03
1
Это не учитывает отрицательные показатели. Лучший способ, который я знаю, - это try / except IndexError, но было бы неплохо иметь краткий способ получить bool
Абрам
В Python отрицательные индексы в списках просто отсчитывают в обратном порядке от конца списка. Таким образом, они не могли существовать так, чтобы влиять на длину списка.
JonathanV
84

Мне нужно написать такой код, чтобы, если существует определенный индекс списка, запустить функцию.

Это идеальное использование для блока try :

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)).

Вы можете использовать enumerate, если хотите, чтобы индексы были между 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...

Если вы ищете какую-то определенную «индексную» мысль, я думаю, вы задаете неправильный вопрос. Возможно, вам следует рассмотреть возможность использования контейнера сопоставления (например, dict) вместо контейнера последовательности (например, списка). Вы можете переписать свой код так:

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 вместо try /, за исключением более короткой версии:

>>> something_to_do.get(3, default)('bob')
some thing 1 done with bob
>>> something_to_do.get(22, default)('alice')
nothing done with alice
Dawg
источник
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 (list) - 1' ,
Лиор Маген,
9
@LiorMagen: Вы правы, я редактировал это. Это довольно жестко, чтобы проголосовать против довольно популярного поста за такую ​​педантическую ошибку. Достаточно простого комментария.
dawg
Я укажу , что торчащие вещи Внутри tryничего не сказать, если индекс существует только если это fetchable - взятие -1- этот показатель на самом деле не существует , но значение будет возвращено.
Джордж Мауэр
17

len(nams)должно быть равно nв вашем коде. Все индексы 0 <= i < n«существуют».

JFS
источник
15

Это можно сделать, просто используя следующий код:

if index < len(my_list):
    print(index, 'exists in the list')
else:
    print(index, "doesn't exist in the list")
user6039980
источник
6

Мне нужно написать такой код, чтобы, если существует определенный индекс списка, запустить функцию.

Вы уже знаете, как это проверить, и фактически уже выполняете такие тесты в своем коде. .

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

Таким образом, список имеет индекс i тогда и только тогда, когда длина списка не меньше i + 1.

Карл Кнехтель
источник
Да, у меня были инструменты для решения моей проблемы, просто я не использовал их четко. Спасибо за точку в правильном направлении.
user1569317 03
Спасибо за это, особенно за последнее предложение, которое является важным свойством списков Python, которое отличает их от массивов JavaScript и других подобных конструкций.
Роберт
6

Использование длины списка было бы самым быстрым решением для проверки существования индекса:

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

Это также проверяет наличие отрицательных индексов и большинства типов последовательностей (Like rangesи strs), которые имеют длину.

Если вам все равно нужно получить доступ к элементу в этом индексе впоследствии, проще попросить прощения, чем разрешения , и это также быстрее и более 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
Artyer
источник
3

Если вы хотите перебрать вставленные данные актеров:

for i in range(n):
    if len(nams[i]) > 3:
        do_something
    if len(nams[i]) > 4:
        do_something_else
gepatino
источник
1

хорошо, поэтому я думаю, что это действительно возможно (ради аргумента):

>>> your_list = [5,6,7]
>>> 2 in zip(*enumerate(your_list))[0]
True
>>> 3 in zip(*enumerate(your_list))[0]
False
avloss
источник
хотя это было бы еще проще:3 in range(len(your_list)
avloss 02
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

Один лайнер:

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' в словаре dict:

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

if 'age' in dic

возвращает истину, если существует "возраст".

Marco
источник
1
Не лучший ответ на вопрос. Речь шла о списках, а не о словарях. То, что вы предложили, невозможно сделать в таких случаях: ["joao", 39]
Ruhrpottpatriot