[英]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
並為每個唯一元素返回元素計數對來創建所需的Output
: TupleOfElements
包含正確數量的所有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.