Скажем, у меня есть список l, который содержит [5, 10, 15, 16, 20]. Я хочу получить первые элементы, которые все делятся на 5 (т.е. первые три элемента), без последнего 20. Как мне это сделать? Я сделал:

done = False
i = 0
while not done and i < len(l):
    if l[i] % 5 == 0:
        answer.append(source[i])
    else:
        done = True
    i += 1

Однако это кажется неэффективным. Есть ли лучший способ сделать это?

3
Cutewarriorlover 12 Июн 2021 в 19:18

6 ответов

Лучший ответ

Кажется, вам понравится функция itertools.takewhile :

from itertools import takewhile
list(takewhile(lambda x: x % 5 == 0, [5, 10, 15, 16, 20]))

Это возвращает [5, 10, 15].

4
Sam Estep 12 Июн 2021 в 16:24

Ваша идея на самом деле является эффективным ответом, поскольку позволяет избежать обработки большего количества элементов, чем необходимо. Ответ @SamEstep должен быть принятым ответом, потому что он использует itertools точно так, как задумано, но, тем не менее, правильная настройка для вашего кода будет следующей:

l = [5, 10, 15, 16, 20]
result = []
for elem in l:
    if elem % 5 == 0:
        result.append(elem)
    else:
        break
# [5, 10, 15]

Структуры управления

В качестве побочного примечания: цикл while, который просто индексирует список, не рекомендуется, потому что он делает ваши намерения менее явными и делает ваш код более подверженным ошибкам, поскольку вам придется самостоятельно обрабатывать индексацию. Лучше написать:

for i in range(len(l)):

Который дает вам индекс для каждого элемента в списке. Однако, если все, что вы собираетесь сделать, это проиндексировать список, вы можете просто перебрать каждый элемент в списке, что повысит удобочитаемость (это то, что я сделал выше):

for elem in l:

Если вам нужны оба индекса и элемента, используйте enumerate:

for idx, elem in enumerate(l):

Это сделает ваш код более читабельным и менее подверженным ошибкам.

3
Kraigolas 12 Июн 2021 в 16:32

В блоке кода else просто используйте break.

2
pepper 12 Июн 2021 в 16:23

Допустим, у вас есть список myList и вы хотите найти в нем элементы, которые можно разделить на n:

myList = [1,2,10,12,5,20]
ansList = []
ansCount = 0
for i in myList:
    if i % n == 0:
        # condition is true, do whaterver you want with "i"; here I added it to a new list(ansList)
        ansList.append(i)
        ansCount += 1
        # you can also break the loop as your wish
        if ansCount > 2:
            break
0
Mohammad Reza Noorzade 12 Июн 2021 в 16:27

Это не совсем неэффективно, но, вероятно, более понятный способ -

l = [5, 10, 15, 16, 20]
result = []
for item in l:
    if item % 5 == 0:
        result.append(item)
    else:
        break

Это дает [5, 10, 15]

0
rohit keshav 12 Июн 2021 в 16:30

Вы можете использовать что-то вроде этого

mylist = [5, 10, 15, 16, 20]
result = []
for item in mylist:
    if item % 5 != 0:
        break
    result.append(item)
print(result)
0
Sven Eberth 13 Июн 2021 в 00:19