2014-06-22 164 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倍左右更快我彌補了自己的好奇心 - 我應該設想一下,因爲它會用元組和迭代器代替字典創建步驟。它可能不是相當作爲優雅,但我有點爲它感到自豪。

相關問題