我想得到以下结果:
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})
答案 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.defaultdict
与frozenset
一起使用。
这是有效的,因为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})