计算元组列表中的重复项

时间:2015-07-03 13:05:56

标签: python list tuples

我有一个元组列表,例如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

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

5 个答案:

答案 0 :(得分:11)

您可以使用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_element

second_elementCounter现在包含元组中每个元素的值>>> 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

在元组列表的第一个元素中,值@media (orientation:portrait) { #header { position:fixed; top:0;} } 出现了一次。

答案 1 :(得分: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})

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

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

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

答案 2 :(得分:4)

您可以创建count_map,并将每个元组的计数存储为值。

>>> 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}

答案 3 :(得分:2)

使用pandas这很简单,也很快:

import pandas
print(pandas.Series(data=[(1,2),(1,4),(1,2),(6,7),(2,9)]).value_counts())

(1, 2)    2
(1, 4)    1
(6, 7)    1
(2, 9)    1
dtype: int64

答案 4 :(得分:2)

也许词典可以更好地运作。因为在您的代码中,您将在列表中旅行两次。这使得代码的complexity为O(n ^ 2)。这不是一件好事:)

最好的方法是行驶一次并为每次行程使用1或2个条件。这是我对这类问题的第一个解决方案。

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

dict = {}
for (i,j) in a:
    if dict.has_key(i):
            dict[i] += 1
    else:
            dict[i] = 1

print dict

对于此代码,这将给出输出:

{1: 3, 2: 1, 6: 1}

我希望它会有所帮助。