计算元组列表中的重复项

2024-05-14 05:55:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个元组列表:a = [(1,2),(1,4),(1,2),(6,7),(2,9)]我想检查每个元组的单个元素是否与另一个元组中的同一位置/元素匹配,以及这种情况发生的次数。

例如:如果某些元组中只有第一个元素有重复项,则返回元组及其重复次数。 我可以用下面的代码来实现:

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

我想知道有没有更有效的方法?


Tags: 方法代码in元素列表forif情况
3条回答

你可以使用^{}

from collections import Counter
a = [(1,2),(1,4),(1,2),(6,7),(2,9)]
counter=Counter(a)
print counter

这将输出:

Counter({(1, 2): 2, (6, 7): 1, (2, 9): 1, (1, 4): 1})

它是一个类似字典的对象,项(本例中是元组)作为键,值包含看到该键的次数。您的(1,2)元组出现两次,而所有其他元组只出现一次。

>>> counter[(1,2)]
2

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

first_element = Counter([x for (x,y) in a])
second_element = Counter([y for (x,y) in a])

first_elementsecond_element现在包含一个Counter值在元组中每个元素中出现的次数

>>> first_element
Counter({1: 3, 2: 1, 6: 1})
>>> second_element
Counter({2: 2, 9: 1, 4: 1, 7: 1})

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

>>> first_element[2]
1

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

使用集合库。在下面的代码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})

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

>>> print val_2
<<< Counter({2: 2, 9: 1, 4: 1, 7: 1})

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

您可以制作count_映射,并将每个元组的计数存储为值。

>>> count_map = {}
>>> for t in a:
...     count_map[t] = count_map.get(t, 0)  +1
... 
>>> count_map
{(1, 2): 2, (6, 7): 1, (2, 9): 1, (1, 4): 1}

相关问题 更多 >