如何在一个元组列表中计算重复项的数量?

3

我有一个Python元组列表,如下所示:

listoftups = [('A', 'B'), ('C','D'), ('E','F'), ('G','H'), ('A','B'), ('C','D')] 

我希望能够计算这个元组列表中的重复项数量,并希望输出结果如下:
A -> B 2
C -> D 2
E -> F 1
G -> H 1

我该如何用Python实现这个功能?我正在考虑使用计数器,但不确定是否可行。谢谢。


为什么你的输出中会出现 G->H 特征,考虑到它不是重复项? - iruvar
5个回答

5
您可以使用“计数器”
listoftups = [('A', 'B'), ('C','D'), ('E','F'), ('G','H'), ('A','B'), ('C','D')] 
from collections import Counter 
for k, v in Counter(listoftups).most_common():
    print "{} -> {} {}".format(k[0], k[1], v)

输出

A -> B 2
C -> D 2
G -> H 1
E -> F 1

这很好,但我该如何按元组列表中的第一个字符串对此输出进行排序?当我使用计数器时,它会按最多到最少进行排序。 - Hell Man
1
huh@HellMan?sorted(Counter([('A', 'B'), ('C','D'), ('E','F'), ('G','H'), ('A','B'), ('C','D')]).items()) - iruvar

1
您可以使用列表的计数方法:

count

listoftups = [('A', 'B'), ('C','D'), ('E','F'), ('G','H'), ('A','B'), ('C','D')] 
tup = listoftups.count(('A', 'B')) # returns 2

并将它们全部计入一个字典中:
result = dict()
for tup in set(listoftups):
    result[tup] = listoftups.count(tup)

或者更简洁地使用字典推导式:
result = {tup:listoftups.count(tup) for tup in set(listoftups)}

在你手上有一个字典:

result = { ('A', 'B'): 2, ('C', 'D'): 2, ('E','F'): 1, ('G', 'H'): 1}

你可以以与fourtheye相同的方式打印它,或者:

for k, v in result.items():
    print k[0] + "->" + k[1] + " ", v

1
import collections
result = collections.defaultdict(int)
def f(tup):
    result[tup] += 1
map(lambda t: f(t), listoftups)

defaultdict(<type 'int'>, {('G', 'H'): 1, ('A', 'B'): 2, ('C', 'D'): 2, ('E', 'F'): 1})

1
首先,使用set获取一个没有重复项的列表。然后遍历它们,并按所需格式使用count打印它们:
listoftups = [('A', 'B'), ('C','D'), ('E','F'), ('G','H'), ('A','B'), ('C','D')] 

listoftups = list(set(listoftups))
for el in listoftups:
    print "{} -> {} {}".format(el[0], el[1], listoftups.count(el))

如果您想保留顺序,请按以下方式创建唯一值:
tmp = []
for el in listoftups:
    if el not in tmp:
        tmp.append(el)

然后执行我在第一个示例中执行的for循环。

1
from collections import Counter


tuples = [('A', 'B'), ('C', 'D'), ('E', 'F'), ('G', 'H'), ('A', 'B'), ('C', 'D')]

counted = Counter(tuples).most_common()

s_t = sorted(counted, key=lambda x: x[0][0])

for key, value in s_t:
    print key, value

上面的代码还将根据元组中第一个字符串的值进行排序。
控制台会话:
>>> from collections import Counter
>>> tuples = [('A', 'B'), ('C', 'D'), ('E', 'F'), ('G', 'H'), ('A', 'B'), ('C', 'D'), ('C', 'D'), ('C', 'D')]
>>> counted = Counter(tuples).most_common()
>>> counted
Out[8]: [(('C', 'D'), 4), (('A', 'B'), 2), (('G', 'H'), 1), (('E', 'F'), 1)]
>>> sorted_tuples = sorted(counted, key=lambda x: x[0][0])
>>> sorted_tuples
Out[10]: [(('A', 'B'), 2), (('C', 'D'), 4), (('E', 'F'), 1), (('G', 'H'), 1)]

@1_CR 我不确定,但这是我的习惯。 - Games Brainiac

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