在Python中的列表中保留重复项

myn*_*ame 8 python duplicates

我知道这可能是一个简单的答案,但我无法弄清楚.Python中保留重复项的最佳方法是什么:

x = [1,2,2,2,3,4,5,6,6,7]
Run Code Online (Sandbox Code Playgroud)

输出应该是:

[2,6]
Run Code Online (Sandbox Code Playgroud)

我发现这个链接:在python中查找(并保留)子列表的副本,但我仍然相对较新的Python,我无法让它用于一个简单的列表.

mgi*_*son 14

我用的是collections.Counter:

from collections import Counter
x = [1, 2, 2, 2, 3, 4, 5, 6, 6, 7]
counts = Counter(x)
output = [value for value, count in counts.items() if count > 1]
Run Code Online (Sandbox Code Playgroud)

这是另一个版本,它保持项目第一次复制时的顺序,只假设传入的序列包含可清除的项目,并且它将返回到何时set或被yeild引入语言时(无论何时).

def keep_dupes(iterable):
    seen = set()
    dupes = set()
    for x in iterable:
        if x in seen and x not in dupes:
            yield x
            dupes.add(x)
        else:
            seen.add(x)

print list(keep_dupes([1,2,2,2,3,4,5,6,6,7]))
Run Code Online (Sandbox Code Playgroud)


Joc*_*zel 8

如果列表已经排序,这是一个简短的方法:

x = [1,2,2,2,3,4,5,6,6,7]

from itertools import groupby
print [key for key,group in groupby(x) if len(list(group)) > 1]
Run Code Online (Sandbox Code Playgroud)