减少重复元组的列表并重复计数

时间:2013-11-08 22:21:16

标签: python list

我想知道如何减少元组列表,如下所示:

[('a','b'),('b','a'),('c','d')]

以下内容:

[('a','b'),('c','d')]

还计算元素重复的次数,并返回一个将计数与元组相关联的列表。从这个例子中,该列表将是[2,1]

谢谢!


我试过了:

l = [('a','b'),('c','d')]
counts_from_list = [len(list(group)) for group in itertools.groupby(my_list)]
zip(set(l), counts_from_list)

2 个答案:

答案 0 :(得分:3)

使用Counter,首先对项目进行排序,以确保('a', 'b')('b', 'a')“相同”。

>>> data = [('a','b'),('b','a'),('c','d')]
>>> data = [tuple(sorted(x)) for x in data]
>>> from collections import Counter
>>> c = Counter(data)
>>> c
Counter({('a', 'b'): 2, ('c', 'd'): 1})

访问数据

>>> c.keys()
[('a', 'b'), ('c', 'd')]
>>> c.values()
[2, 1]
>>> c.items()
[(('a', 'b'), 2), (('c', 'd'), 1)]
>>> 

答案 1 :(得分:0)

使用set检查元组,无论其商品的顺序如何。

my_list = [('a','b'),('b','a'),('c','d')]
my_list = map(set, my_list)   

而不是

counts_from_list = [len(list(group)) for group in itertools.groupby(my_list)]

你应该使用

counts_from_list = [len(list(value)) for group, value in itertools.groupby(my_list)]

因为itertools.groupby(my_list)返回键值对

但我建议你使用collections.Counter

collections.Counter(map(frozenset, [('a','b'),('b','a'),('c','d')])).values()

set在这里不合适,因为它不可用。