如何将这个由元组组成的元组转换为其元素数量的计数?

3

我有一个元组里面包含多个元组:

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

我希望将其转换为以下结果:

我想将其转换为以下结果:

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

在这种情况下,例如 TupleOfTuples 包含 ('Venue1', 2),其中 2'Venue1'TupleOfTuples 中出现的次数。
我尝试使用 len() 来计算出现次数,但由于 TupleOfTuples 不是单个元组而是一个元组的集合,所以无法使用。
如何在 Python2.7 中实现呢?

简单的循环和计数就可以解决。 - Eugene K
2个回答

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)]

标记为答案。最佳且唯一的答案 :) - guagay_wk

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 并为每个唯一元素返回一个元素计数对来创建你想要的 Output:其中TupleOfElements 包含了所有正确数量的 TupleOfTuples 元素,所以我们可以使用 TupleOfElements.count(uniqueElement) 来告诉我们有多少个 uniqueElement 的出现次数。然而,我们不需要或希望重新检查任何特定元素超过一次,因此我们遍历 set(TupleOfElements),其中将恰好包含每个出现的元素各一个。我们将结果赋值给 Output,然后完成!

  • 注意:这将把Output作为一个tuple返回。如果你想要它作为一个list,请将第二行中的tuple(..)替换为[..],保持内容不变。

  • 关于性能:这段代码似乎比Martijn使用collections.Counter的非常好的解决方案运行得快得多——对于给定的示例TupleOfTuples,大约快了3.5倍,在我自己好奇心驱使下进行的一个更大但更简单的88888元素测试中,速度提高了约1.25倍——我想这是因为它用一个元组和迭代器替换了字典创建步骤。它可能不是完全优雅,但我还是有点自豪的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接