Если я хочу перебрать список с помощью цикла for, я могу сделать что-то вроде:
elements = [1,2,3,4,5,6,7,8,9,10]
for element in elements:
print(element)
и он выведет:
1
2
3
4
5
6
7
8
9
10
Но мне любопытно, есть ли способы, которыми я могу заставить цикл сказать мне, что в настоящее время не повторяется?
Например:
когда element
равно 1
, он может вывести список, похожий на этот [2,3,4,5,6,7,8,9,10]
, и когда цикл продолжается, каждый раунд он будет выводить что-то вроде:
[1,3,4,5,6,7,8,9,10]
[1,2,4,5,6,7,8,9,10]
[1,2,3,5,6,7,8,9,10]
[1,2,3,4,6,7,8,9,10]
[1,2,3,4,5,7,8,9,10]
[1,2,3,4,5,6,8,9,10]
[1,2,3,4,5,7,8,9,10]
[1,2,3,4,5,6,7,9,10]
[1,2,3,4,5,6,7,8,10]
[1,2,3,4,5,6,7,8,9]
Заранее спасибо.
Итак, вы хотите пропускать определенные записи при каждой итерации? Звучит как работа для filter()
.
если elements = [1,2,1], вы, вероятно, захотите [2,1], [1,1], [1,2], чтобы фильтровать по индексу, а не по значению.
используйте перечисление, как показано ниже:
for i, element in enumerate(elements):
not_iterated = [x for j,x in enumerate(elements) if j!=i]
print(not_iterated)
это будет вывод:
[2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Используйте enumerate(<iterable>)
и напечатайте две части списка, пропустив соответствующий элемент.
elements = [1,2,3,4,5,6,7,8,9,10]
for i, element in enumerate(elements):
print(elements[:i] + elements[i+1:])
(Обратите внимание, что вы не получите IndexError, поскольку это срез. elements[i+1]
приведет к IndexError; срез даст пустой список.)
Решение без enumerate()
и с filter()
:
for element in elements:
print(list(filter(lambda x: x != element, elements)))
(К сожалению, вам понадобится list(...)
, так как filter()
оценивается лениво, то есть он будет возвращать элементы только в том случае, если он действительно повторяется. print()
не делает этого, а list()
делает.)
Это примерно то же самое, что и некоторые другие решения, показанные здесь, которые используют понимание списка. Некоторые люди предпочитают фильтр, но я думаю, что использование понимания списка считается немного более питоническим. Но очень личное предпочтение:
for element in elements:
print([item for item in elements if item != element])
Большое предостережение для методов без перечисления: это работает только тогда, когда значения списка уникальны, поскольку они сравнивают значения, а не индекс списка. Если в списке есть повторяющиеся элементы, вывод, скорее всего, не будет таким, как вы хотите.
Большое спасибо. enumerate
работает отлично. И спасибо за подробное объяснение.
Вы можете использовать вспомогательный объект set
, чтобы проверить разницу:
elements = [1,2,3,4,5,6,7,8,9,10]
el_set = set(elements)
for el in elements:
print(el_set - set([el]))
{2, 3, 4, 5, 6, 7, 8, 9, 10}
{1, 3, 4, 5, 6, 7, 8, 9, 10}
{1, 2, 4, 5, 6, 7, 8, 9, 10}
{1, 2, 3, 5, 6, 7, 8, 9, 10}
{1, 2, 3, 4, 6, 7, 8, 9, 10}
{1, 2, 3, 4, 5, 7, 8, 9, 10}
{1, 2, 3, 4, 5, 6, 8, 9, 10}
{1, 2, 3, 4, 5, 6, 7, 9, 10}
{1, 2, 3, 4, 5, 6, 7, 8, 10}
{1, 2, 3, 4, 5, 6, 7, 8, 9}
Но только когда предметы уникальны; и порядок вывода не определен.
Если вы хотите сравнить по значению, а не по индексу (обратите внимание, что в списке уникальных элементов нет различий, поэтому, если вы не уверены, что хотите, вам нужно подумать, каким должен быть результат в список, например [1, 1, 2, 2, 3, 3]
), вы можете пропустить enumerate
и просто выполнить понимание списка, которое даст вам все элементы, которые не равны текущему:
>>> elements = range(1, 11)
>>> for element in elements:
... print([i for i in elements if i != element])
...
[2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Вы можете использовать enumerate, чтобы получить индекс каждого элемента, удалить текущий индекс из копии списка и распечатать остальные.