如何将这个元组元组转换为元素数?

时间:2014-06-22 01:53:37

标签: python python-2.7 count tuples

我有tuple个元组:

TupleOfTuples = (('Venue1', 'Name1'), ('Venue1', 'Name2'), 
                 ('Venue2', 'Name3'), ('Venue3', 'Name4'), 
                 ('Venue3', 'Name5'), ('Venue3', 'Name6'))

我想转换它以得到这样的结果:

Output = (('Venue1', 2), ('Venue2', 1), ('Venue3', 3))

在这种情况下,Output包含('Venue1', 2),其中2'Venue1'TupleOfTuples发生的次数。

我尝试使用len()来计算出现次数,但是由于TupleOfTuples不是单个元组而是元组元组,所以它不起作用。

如何在Python2.7中完成?

2 个答案:

答案 0 :(得分:5)

使用collections.Counter()计算您的出现次数:

from collections import Counter

Output = Counter(t[0] for t in TupleOfTuples).items()

Counter()是一个字典,其中键被映射到计数;通过传入生成器表达式,它将为您进行计数。因为它是字典子类,所以dict.items()可用于生成(key, count)元组的列表。

这会产生列表;如果你坚持在这里使用元组,只需简单地调用tuple()

演示:

>>> from collections import Counter
>>> TupleOfTuples = ( ('Venue1', 'Name1'), ('Venue1', 'Name2'), ('Venue2', 'Name3'), ('Venue3', 'Name4'), ('Venue3', 'Name5'), ('Venue3', 'Name6') )
>>> Counter(t[0] for t in TupleOfTuples).items()
[('Venue1', 2), ('Venue3', 3), ('Venue2', 1)]

答案 1 :(得分:1)

您可以使用zip(*TupleOfTuples)[n]快速轻松地完成此操作,以获取要计算的所有元素的序列(其中n是要计数的每个TupleOfTuples元组中元素的索引;在这种情况下,0),然后遍历结果以获得每个唯一元素的计数。

这就是它的样子:

TupleOfElements = zip(*TupleOfTuples)[0]
Output = tuple((e, TupleOfElements.count(e)) for e in set(TupleOfElements))

我将解释发生了什么:

zip(*TupleOfTuples)[0]获取您的输入序列和transposes it。我们需要每个TupleOfTuples元素中的零' 元素,因此我们从结果中取[0]。我们将该序列分配给TupleOfElements。 (例如,如果您想要计算 Name * 元素,则可以使用zip(*TupleOfTuples)[1]。)

tuple((e, TupleOfElements.count(e)) for e in set(TupleOfElements))通过遍历Output并为每个唯一元素返回元素计数对来创建所需的TupleOfElementsTupleOfElements包含 all {{1}正确数量的元素,因此我们可以使用TupleOfTuples告诉我们TupleOfElements.count(uniqueElement)出现了多少次。但是,我们不需要或想要不止一次地重新检查任何特定元素,因此我们遍历set(TupleOfElements),它将包含每个元素中的一个元素。我们将结果分配给uniqueElement,我们已完成!

  • 注意:这会将Output作为Output返回。如果您想将其作为tuple,请将第二行中的list替换为tuple(..),并保持内容相同。

  • 关于性能:此代码似乎比使用[..]的Martijn非常好的解决方案快得多 - 对于示例collections.Counter,大约快3.5倍,大约1.25在一个更大但更简单的88,888元素测试中,我做得更快,以满足自己的好奇心 - 我应该想象,因为它用元组和迭代器取代了字典创建步骤。它可能不像那样优雅,但我对此一点感到自豪。