Если индекс списка существует, выполните 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.

1
Похоже, вы хотите ввести приведение nкак целое число, а не как список. Я запутался.
— mVChr 02

2
Да, реальная проблема здесь используется nвместо namsв ifс
— Wooble

В вашем случае n - это не список. Сначала проверьте (приведите) его как целое число, затем вы можете перебирать или перечислять в зависимости от эффекта, которого хотите достичь.
— непринужденный

Ага, опечатка. Исправлено в nams []
— user1569317 02

"тот факт, что у меня есть sub if утверждения о len (my_list)." Задумывались ли вы о том, что подразумевается в отношении того, какие индексы списка существуют, исходя из того факта, что lenсписок имеет по крайней мере определенное значение?
— Карл Кнехтель

Ответы:


157

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


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

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«существуют».


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.


Да, у меня были инструменты для решения моей проблемы, просто я не использовал их четко. Спасибо за точку в правильном направлении.
— 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

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

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


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