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