#python
#python
Вопрос:
Я пытаюсь сжать следующий простой цикл
a = [1,2,3,2,1,5,6,5,5,5]
for x in set(a):
a.remove(x)
Это работает хорошо, но мне нужно знать, возможно ли применить сжатый цикл for подобным образом
a = [x for x in set(a):a.remove(x)]
Мой желаемый результат — получить или перечислить только дубликаты и получить их список, поэтому желаемый результат [1,2,5]
Код работает хорошо
a = [1,2,3,2,1,5,6,5,5,5]
for x in set(a):
a.remove(x)
print(list(set(a)))
Моя цель — не код, а сжатие цикла в цикле. Мне нужно изучить этот трюк.
** Найдено простое и эффективное решение:
print(list(set([x for x in a if a.count(x) > 1])))
Комментарии:
1.
set(a)
удалит дубликаты. Это приводит к{1, 2, 5}
. Вы собираетесь выполнить итерацию через это и удалить значения. Это приводит к подмножеству. Это то, что вы хотите?2. Я не понял, что вы имеете в виду (простите меня, поскольку я новичок). Мне нужно знать структуру использования
x for x in ...
. Буду ли я использовать другую переменную вместоa
переменной?3. @JoeFerndz Он не удалит все. Это просто удалит первое вхождение каждого числа в списке.
4. Итак, вы хотите получить
[1, 2, 3, 5, 6]
ответ?5. Итак, вы хотите получить набор a. Зачем вам нужно выполнять понимание списка, когда python уже предоставляет вам возможность
set(a)
. Если это для целей обучения, тогда ок.
Ответ №1:
Оригинальный вопрос
a = a if not all([a.remove(i) for i in set(a) ]) else []
print(a)
Как было предложено Copperfield, также работает следующее:
a = any(a.remove(i) for i in set(a) ) or a
Обновленный вопрос
from collections import Counter
a = [1,2,3,2,1,5,6,5,5,5]
print([k for k, v in Counter(a).items() if v > 1])
Комментарии:
1. вы также можете использовать
or
для этого:a = all([a.remove(i) for i in set(a) ]) or a
2.
any
тоже работает, и вам не нужно создавать с ним временный список:a = any(a.remove(i) for i in set(a) ) or a
3. Большое спасибо. Когда я попробовал ваш код и попытался напечатать так,
print(set(a))
я получил{1, 2, 5}
. Возможно ли получить его в виде списка[1, 2, 5]
?4. @YasserKhalil Вы получили
set
тип, потому что вы преобразовали его в первую очередь, вызвавset(..)
constructor . Попробуйте print withprint(a)
, потомуa
что это уже тип списка.5. @YasserKhalil Если вы хотите
[1, 2, 5]
получить конечный результат, вы можете использоватьlist(...)
afterset(...)
следующим образом:print(list(set(a)))
.
Ответ №2:
найдите дубликаты в списке
print ([c for i,c in enumerate(a) if a.count(c) > 1 and i==a.index(c)])
Результатом этого будет:
[1, 2, 5]
альтернативный для set(a)
Вот понимание списка для создания того же результата, что и
print(list(set(a)))
Этого можно достичь, выполнив следующее:
print([c for i,c in enumerate(a) if i==a.index(c)])
Здесь я проверяю, является ли элемент c
первым, с которым мы столкнулись (индекс есть i
), и если да, то добавьте в список, иначе игнорируйте.
Результат обоих этих действий будет:
[1, 2, 3, 5, 6]
Хотя результат тот же, я бы настоятельно рекомендовал использовать первый метод, а не выполнять цикл for и проверять индекс. Стоимость слишком высока для этого по сравнению с list(set(a))
Комментарии:
1. Большое спасибо. Но желаемый вывод для перечисления дубликатов
[1,2,5]
2. Позвольте мне написать код, чтобы предоставить вам дубликаты. Я не думаю, что это слишком сложно.
3. Я обновил вопрос, чтобы прояснить проблему.
4. @YasserKhalil, посмотри, решило ли это твою проблему. Вам просто нужно проверить, больше ли count of
c
1.
Ответ №3:
Вы можете просто сделать:
a = [1,2,3,2,1,5,6,5,5,5]
[a.remove(x) for x in set(a)]
print(a)
a
будут иметь те же элементы, что и после вашего for
цикла.
Вы можете прочитать больше о понимании списков.
Комментарии:
1. это приведет к
[None, None, None, None, None]
тому, что это не то, чего хочет OP2. Большое спасибо. Я использовал эту строку в конце
print(list(set(a)))
, и она работает хорошо.3. @JoeFerndz я не делаю
a = [a.remove(x) for x in set(a)]
. Так что нет,a
будет[2, 1, 5, 5, 5]
. Точно так же, как послеfor
цикла OP.4.
list(set(a))
это не то же[a.remove(x) for x in set(a)]
самое, что . Выходные данные будут разными.5. @JoeFerndz, уверен, что все будет по-другому. Вопрос OP касается понимания списка вместо упомянутого
for
цикла. Итак, я даю ответ на заданный вопрос.