Python:如何将列表中的元组('a','b')和元组('b','a')计为同一个东西?

时间:2018-04-17 13:03:21

标签: python list count tuples

我想得到以下结果:

Input:  list = [('a' , 'b'), ('b', 'a'), ('c', 'd'), ('d','e'), ('e','d')] 
Output: Counter({('a','b'):2,('c','d'):1, ('d','e'):2})

我试图将计数器实现为:

count = Counter(list)

它只能返回:

Counter({('a', 'b'):1,  ('b', 'a'):1, ('c', 'd'):1,  ('d', 'e'):1, ('e','d'):1})

2 个答案:

答案 0 :(得分:5)

首先对元组进行排序:

In [21]: l = [tuple(sorted(i)) for i in l]

In [22]: l
Out[22]: [('a', 'b'), ('a', 'b'), ('c', 'd'), ('d', 'e'), ('d', 'e')]

In [23]: Counter(l)
Out[23]: Counter({('a', 'b'): 2, ('c', 'd'): 1, ('d', 'e'): 2})

答案 1 :(得分:0)

您可以将collections.defaultdictfrozenset一起使用。

这是有效的,因为frozenset是可清除的,因此可以用作字典中的键。

如果订单不保存是目标,那么这是每次排序的一个很好的替代方案。

from collections import defaultdict

lst = [('a' , 'b'), ('b', 'a'), ('c', 'd'), ('d','e'), ('e','d')]

d = defaultdict(int)

for i in map(frozenset, lst):
    d[i] += 1

# defaultdict(int,
#             {frozenset({'a', 'b'}): 2,
#              frozenset({'c', 'd'}): 1,
#              frozenset({'d', 'e'}): 2})