0

我想知道如何减少如下的元组列表:

[('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)
4

2 回答 2

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)]
>>> 
于 2013-11-08T22:23:09.987 回答
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在这里不合适,因为它不可散列。

于 2013-11-08T22:38:17.153 回答