2014-06-22 108 views
3

我有这个tuple元组:我如何将这个元组元组转换为元素数?

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

我想将它转换为得到这样一个结果:

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

在这种情况下,Output包含,例如,在2是次数'Venue1'发生在TupleOfTuples

我尝试使用len()来计算出现次数,但它不起作用,因为TupleOfTuples不是一个单一的元组,而是元组的元组。

这怎么能在Python2.7中完成?

+0

简单的循环和保持计数将工作。 –

回答

5

使用collections.Counter()算你多少次有:

from collections import Counter 

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

一个Counter()就是按键映射到计数字典;通过传递一个生成器表达式,它会为你计数。因为它是一个字典子类,因此可以使用dict.items()来生成一个元组列表。

这确实会产生一个列表;如果你坚持在这里有一个元组,就简单地打电话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)] 
+0

标记为答案。最好和唯一的答案:) – user781486

1

可以快速且容易地实现此目的使用zip(*TupleOfTuples)[n]获得要被计数的所有元素的序列(其中,n是在每个TupleOfTuples元组计数元素的索引;在这种case,0),然后遍历结果以获得每个唯一元素的计数。

这里是什么样子:

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

我会解释这是怎么回事:

zip(*TupleOfTuples)[0]需要你输入序列和transposes it。我们希望每个TupleOfTuples元素的为零的第个元素,所以我们从结果中取[0]。我们将该序列分配给TupleOfElements。 (如果你想算名称*元素代替,例如,你可以使用zip(*TupleOfTuples)[1]。)

tuple((e, TupleOfElements.count(e)) for e in set(TupleOfElements))创建你想通过TupleOfElements迭代,并为每一个独特元素返回一个元素数对的OutputTupleOfElements包含全部TupleOfTuples元素的正确数量,所以我们可以使用TupleOfElements.count(uniqueElement)会告诉我们有多少次出现uniqueElement有。不过,我们不需要或不想重新检查任何特定元素,因此我们遍历了set(TupleOfElements),它将包含每个元素中的一个。我们将结果分配到Output,我们完成了!

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

  • 在性能:此代码似乎使用collections.Counter跑得比马亭的很好的解决方案相当快 - 3.5倍左右更快给出的例子TupleOfTuples,并在一个更大的,但要简单得多88888元测试1.25倍左右更快我弥补了自己的好奇心 - 我应该设想一下,因为它会用元组和迭代器代替字典创建步骤。它可能不是相当作为优雅,但我有点为它感到自豪。

相关问题