2016-08-16 5 views
5

Как найти только парные разряды? Моя версия алгоритмаКак найти и оставить только парные в списке python?

import collections 
a = [1,2,3,4,5,2,4,5] 
b = [] 

for x,y in collections.Counter(a).items(): 
    if y>1: 
     b.append(x) 

print(b) # [2, 4, 5] 

c = [] 
for item in a: 
    if item in b: 
     c.append(item) 

print(c) # [2, 4, 5, 2, 4, 5] 

нужно найти результат, такие как гр

кода дефектов:

  1. три списка (а, б, в), один коллекции (Dict)
  2. долго код

Мне нужно оставить список, удваивает значения, пример. x = [1,2,2,2,3,4,5,6,6,7], необходимо [2,2,2,6,6] не [2,6]

+0

Да, это правильно, так как c list print (c) # [2, 4, 5, 2, 4, 5] – Igor

ответ

14
from collections import Counter 

a = [1, 2, 3, 4, 5, 2, 4, 5] 
counts = Counter(a) 
print([num for num in a if counts[num] > 1]) 
+1

Также можно использовать подсчеты как dict '[x for x, y в counts.items() если y> 1] ' – sberry

+1

Хотя, если заказ важен, то опубликованное решение является лучшим. – sberry

+1

OP требует дубликатов, которые будут возвращены в списке. Поскольку это словарь, итерация по элементам не будет делать этого. – Karin

5

Не самый эффективный способ, но очень краткий:

a = [1,2,3,4,5,2,4,5] 
b = [x for x in a if a.count(x) > 1] 
print(b) 
+0

Да, 'list.count' должен проверять весь список каждый раз, поэтому это O (n^2) по сравнению с решением Karin's O (n). OTOH, если 'a' очень короткий, этот _might_ будет быстрее, поскольку счетчик не совсем быстр, хотя он работает в O (n). –

+2

Это правильно. Решение Karin является эффективным и элегантным. Код, который нравится читать. –

1

@ Карин почти имел это, я думаю, но конечный результат не будет установленным.

from collections import Counter 

a = [1, 2, 3, 4, 5, 2, 4, 5] 
counts = Counter(a) 
print({k for k, v in counts.items() if v >= 2}) 

EDIT: Аааа, "оставить только два раза"

print([x for x in a if counts[x] >= 2]) 

EDIT2: Дополнительный комментарий разъяснение по OP для значений с чем-либо с двойным или более частыми.

+1

OP требует список, содержащий дубликаты («мне нужно оставить список, а не только уникальный»). Требуемый вывод - '[2, 4, 5, 2, 4, 5]'. Мне потребовалось немного времени для интерпретации :) – Karin

+1

Кроме того, OP использует Python 3.x! ;) – dalanmiller

+1

Кроме того, изменение по-прежнему не будет работать по той же причине. Если counts - словарь, ключи всегда будут уникальными ... поэтому вы все равно не вернете дубликаты в списке. – Karin

Смежные вопросы