Краткий цикл for (x для x в …) в python

#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 with print(a) , потому a что это уже тип списка.

5. @YasserKhalil Если вы хотите [1, 2, 5] получить конечный результат, вы можете использовать list(...) after set(...) следующим образом: 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] тому, что это не то, чего хочет OP

2. Большое спасибо. Я использовал эту строку в конце 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 цикла. Итак, я даю ответ на заданный вопрос.