Могу ли я получить элемент из списка, который в данный момент не повторяется?

Если я хочу перебрать список с помощью цикла 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]

Заранее спасибо.

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

MattDMo 05.04.2023 16:26

Итак, вы хотите пропускать определенные записи при каждой итерации? Звучит как работа для filter().

tadman 05.04.2023 16:26

если elements = [1,2,1], вы, вероятно, захотите [2,1], [1,1], [1,2], чтобы фильтровать по индексу, а не по значению.

jarmod 05.04.2023 16:28
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
50
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

используйте перечисление, как показано ниже:

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 работает отлично. И спасибо за подробное объяснение.

Yi Jie Tseng 05.04.2023 16:37

Вы можете использовать вспомогательный объект 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}

Но только когда предметы уникальны; и порядок вывода не определен.

9769953 05.04.2023 16:55

Если вы хотите сравнить по значению, а не по индексу (обратите внимание, что в списке уникальных элементов нет различий, поэтому, если вы не уверены, что хотите, вам нужно подумать, каким должен быть результат в список, например [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]

Другие вопросы по теме