簡體   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