繁体   English   中英

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

[英]How can I convert this tuple of tuples into a count of its elements?

我有这个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中完成?

使用collections.Counter()来计算您有多少次出现:

from collections import Counter

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

Counter()是一个字典,其中键被映射到计数; 通过传入生成器表达式,它将为您进行计数。 因为它是一个字典子类, dict.items()可以使用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)]

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

这是它的样子:

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

我会解释发生了什么:

zip(*TupleOfTuples)[0]接收输入序列并对其进行转置 我们希望从每一个第零元素TupleOfTuples元素,因此,我们采取[0]从结果。 我们将该序列分配给TupleOfElements (例如,如果你想计算Name *元素,你可以使用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 Martijn非常好的解决方案运行得快得多 - 对于给出的示例TupleOfTuples快了大约3.5倍,并且在一个更大但更简单的88,888元素测试中我快了大约1.25倍为了满足自己的好奇心 - 我应该想象,因为它用元组和迭代器取代了字典创建步骤。 它可能不是优雅,但我有点骄傲的这一切一样。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM