计算元组列表中的重复项

Dim*_*rak 5 python tuples list

我有一个元组列表,例如a = [(1,2),(1,4),(1,2),(6,7),(2,9)],我想检查每个元组中的一个元素是否有重复和多少次.例如,检查列表的所有元组的第一部分是否具有dublicate并返回元组以及多少次被公开.我可以使用以下代码执行此操作:

a = [(1,2), (1,4), (1,2), (6,7), (2,9)]

coll_list = []
for t in a:
    coll_cnt = 0
    for b in a:
        if b[0] == t[0]:
            coll_cnt = coll_cnt + 1
    print "%s,%d" %(t,coll_cnt)
    coll_list.append((t,coll_cnt))

print coll_list
Run Code Online (Sandbox Code Playgroud)

我想知道是否有更有效的方法来做这样的事情?

And*_*ndy 11

你可以使用 Counter

from collections import Counter
a = [(1,2),(1,4),(1,2),(6,7),(2,9)]
counter=Counter(a)
print counter
Run Code Online (Sandbox Code Playgroud)

这将输出:

Counter({(1, 2): 2, (6, 7): 1, (2, 9): 1, (1, 4): 1})
Run Code Online (Sandbox Code Playgroud)

它是一个像对象这样的字典,其中包含项(在本例中为元组)作为键,以及包含键被看到次数的值.你的(1,2)元组被看到两次,而其他所有元组只看到一次.

>>> counter[(1,2)]
2
Run Code Online (Sandbox Code Playgroud)

如果您对元组的每个单独部分感兴趣,则可以对元组中的每个元素使用相同的逻辑.

first_element = Counter([x for (x,y) in a])
second_element = Counter([y for (x,y) in a])
Run Code Online (Sandbox Code Playgroud)

first_element并且second_element现在包含一个Counter倍值的数量的被认为每个元素在元组

>>> first_element
Counter({1: 3, 2: 1, 6: 1})
>>> second_element
Counter({2: 2, 9: 1, 4: 1, 7: 1})
Run Code Online (Sandbox Code Playgroud)

同样,这些是类似字典的对象,因此您可以检查特定值直接出现的频率:

>>> first_element[2]
1
Run Code Online (Sandbox Code Playgroud)

在元组列表的第一个元素中,值2出现1次.


yos*_*e_k 6

使用集合库.在下面的代码val_1中,val_2分别给出了元组的每个第一个元素和第二个元素的副本.

import collections
val_1=collections.Counter([x for (x,y) in a])
val_2=collections.Counter([y for (x,y) in a])

>>> print val_1
<<< Counter({1: 3, 2: 1, 6: 1})
Run Code Online (Sandbox Code Playgroud)

这是每个元组的第一个元素的出现次数

>>> print val_2
<<< Counter({2: 2, 9: 1, 4: 1, 7: 1})
Run Code Online (Sandbox Code Playgroud)

这是每个元组的第二个元素的出现次数