Python для каждого, но останавливается после n элементов

#python

#python

Вопрос:

У меня есть список dicts, длина которого может составлять от 0 до 100 элементов. Я хочу просмотреть только первые три элемента, и я не хочу выдавать ошибку, если в списке меньше трех элементов. Как мне сделать это чисто на python?

псевдокод:

 for element in my_list (max of 3):
    do_stuff(element)
  

РЕДАКТИРОВАТЬ: этот код работает, но кажется очень нечистым. Я чувствую, что у python есть лучший способ сделать это:

 counter = 0
while counter < 3:
    if counter >= len(my_list):
        break

    do_stuff(my_list[counter])
    counter  = 1
  

Ответ №1:

Вы могли бы использовать itertools.islice :

 for element in itertools.islice(my_list, 0, 3):
    do_stuff(element)
  

Конечно, если это действительно список, то вы могли бы просто использовать обычный фрагмент:

 for element in my_list[:3]:
    do_stuff(element)
  

Обычные фрагменты в обычных последовательностях «прощают» в том смысле, что если вы запрашиваете больше элементов, чем есть, исключение не будет вызвано.

Ответ №2:

Разрежьте список:

 for element in my_list[:3]:
    do_stuff(element)
  

В документации говорится, что не будет никаких ошибок, если в списке нет элементов по этим индексам, поэтому вы можете безопасно использовать это в списках, содержащих менее 3 элементов. Нарезка списка возвращает новый список.

Немного более эффективным способом (для больших фрагментов) было бы использовать itertools.islice :

 for element in islice(my_list, 0, 3): # or islice(my_list, 3)
    do_stuff(element)
  

Комментарии:

1. Более эффективно? Это всего 3 элемента!

2. Я не уверен, что это на самом деле более эффективно … нарезка списка происходит молниеносно с точки зрения операций python, и, по моему опыту, listiter.__next__ работает быстрее, чем __next__ на большинстве других объектов. Накладные расходы на память для списка из 3 элементов также довольно минимальны. Я думаю, что реальная причина использования islice заключается в поддержке итераций, а не только объектов последовательности.

3. Я думаю, что люди могут писать такие вещи, как slice = islice(fancy_salami, 0, 3); print("Who wants the {}?".format(next(slice))

4. @BurhanKhalid — Да, это должно быть так. 🙂

Ответ №3:

 for element in my_list[:3]:
    do_stuff(element)
  

Ответ №4:

ответ @mhawke идеален, если это на самом деле a list или что-то еще, поддерживающее интерфейс slice.

Для более общего итеративного типа попробуйте всегда удобный enumerate :

 for ii, element in enumerate(my_list):
    if ii>=3:
        break
    do_stuff(element)