获取列表中出现多次的唯一项目列表

20

我有一份物品清单:

mylist = ['A','A','B','C','D','E','D']

我想返回一个只包含出现超过一次的项目的唯一列表,以便我的期望输出将是:

 [A,D]

不确定如何开始,但我的思路是先追加每个项目的计数,然后删除任何等于1的内容。然后去重,但这似乎是一种非常迂回、低效的方式,因此我正在寻求建议。


10个回答

19
你可以轻松地使用collections.Counter来完成你所描述的操作。
from collections import Counter
mylist = ['A','A','B','C','D','E','D']
cnt = Counter(mylist)
print([k for k, v in cnt.items() if v > 1])
# ['A', 'D']

13
如果有人在使用 Python 3,请使用 items() 而不是 iteritems() :https://dev59.com/q10a5IYBdhLWcg3wW3nN#30418498。 - Mark Cramer
现在会抛出一个 SyntaxError。 - branwen85
2
@branwen85 是的,因为在Python 3中,您需要在print参数周围加上括号。print([k for k, v in cnt.items() if v > 1]) 将会起作用。 - muellermarkus
非常完美,谢谢! - undefined

7
>>> mylist = ['A','A','B','C','D','E','D']
>>> set([i for i in mylist if mylist.count(i)>1])
set(['A', 'D'])

对于短列表,这是一种有用且易于理解的方法。但请记住:此解决方案具有二次复杂度(n * n)。使用collections.Counter的解决方案具有线性(2 * n)复杂度。 - Alex

2
import collections
cc = collections.Counter(mylist) # Counter({'A': 2, 'D': 2, 'C': 1, 'B': 1, 'E': 1})
cc.subtract(cc.keys())           # Counter({'A': 1, 'D': 1, 'C': 0, 'B': 0, 'E': 0})
cc += collections.Counter()      # remove zeros (trick from the docs)
print cc.keys()                  # ['A', 'D']

2
尝试这样做:

试试这个:

a = ['A','A','B','C','D','E','D']

import collections
print [x for x, y in collections.Counter(a).items() if y > 1]
 ['A', 'D']

参考:如何使用for循环在Python中查找数组中的重复元素?

或者

def list_has_duplicate_items( mylist ):
    return len(mylist) > len(set(mylist))
def get_duplicate_items( mylist ):
    return [item for item in set(mylist) if mylist.count(item) > 1]
mylist = [ 'oranges' , 'apples' , 'oranges' , 'grapes' ]
print 'List: ' , mylist
print 'Does list have duplicate item(s)? ' , list_has_duplicate_items( mylist )
print 'Redundant item(s) in list: ' , get_duplicate_items( mylist )

参考 https://www.daniweb.com/software-development/python/threads/286996/get-redundant-items-in-list

这篇文章提供了获取列表中冗余项的Python代码示例。

希望这可以帮助到你! - Krupa Patel

2

使用与其他人类似的方法,这是我尝试:

from collections import Counter

    def return_more_then_one(myList):
         counts = Counter(my_list)
         out_list = [i for i in counts if counts[i]>1]
         return out_list

2

It can be as simple as ...

print(list(set([i for i in mylist if mylist.count(i) > 1])))

1
使用set命令可以帮助你实现这个功能,可能像这样:

set命令示例:

X = ['A','A','B','C','D','E','D']
Y = set(X)
Z = []

for val in Y :
    occurrences = X.count(val)
    if(occurrences > 1) :
        #print(val,'occurs',occurrences,'times')
        Z.append(val)

print(Z)

列表 Z 将保存出现多次的列表项。而我给出注释(#)的部分将显示每个出现多次的列表项的出现次数。


0

另一种解决方案是所写的:

def delete_rep(list_):
new_list = []
for i in list_:
    if i not in list_[i:]:
        new_list.append(i)

return new_list

0

这是我不使用包的方法

result = []
for e in listy:
    if listy.count(e) > 1:
        result.append(e)
    else:
        pass
print(list(set(result)))

0

可能不如内部实现快,但是它以(几乎)线性时间执行(因为set查找是对数级别的)

mylist = ['A','A','B','C','D','E','D']
myset = set()
dups = set()
for x in mylist:
    if x in myset:
        dups.add(x)
    else:
        myset.add(x)
dups = list(dups)
print dups

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接