我想知道如何减少元组列表,如下所示:
[('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)
答案 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
在这里不合适,因为它不可用。