2016-02-05 186 views
-4

我想計算一次元組出現在輸出結果中的次數(我改進了我的前一個問題How to join many 「listed」 tuples into one tuple in Python?)。計算輸出結果中出現元組次數的次數

所以我這樣做:

from collections import Counter 
liste = [1,2,3,5,10] 
liste2 = [[1,2,3,5,10], [1,2], [1,5,10], [3,5,10], [1,2,5,10]] 
for elt in liste2: 
    syn = elt # identify each sublist of liste2 as syn 
    nTuple = len(syn) # number of elements in the syn 
    for i in liste: 
     myTuple =() 
     if syn.count(i): # check if an item of liste is in liste2 
       myTuple = (i, nTuple) 
       if len(myTuple) == '0': # remove the empty tuples 
        del(myTuple) 
     else: 
      result = [myTuple] 
      c = Counter(result) 
      for item in c.items(): 
       print(item) 

,我得到了這些結果:

((1,5),1)

((2,5),1)

((3,5),1)

((5,5),1)

((10,5),1)

((1,2),1)

((2,2),1)

((1,3), 1)

((5,3),1)

((10,3),1)

((3,3),1)

((5,3),1)

((10,3),1)

((1,4),1)

((2,4),1)

((5,4),1)

((10,4),1)

代替具有一些的ELT N倍(例如((5,3)的,1 )((10,3),1)出現兩次),我想要一個元組(key,value),其中value = key在'result'中出現的次數。

我想獲得 '結果' 這樣的:

((1,5),1)

((2,5),1)

((3- ,5),1)

((5,5),1)

((10,5),1)

((1,2),1)

((2,2),1)

((1,3),1)

((5,3), )

((10,3),)

((3,3),1)

((1,4),1)

((2,4),1)

((5,4),1)

((10,4),1)

由於

+1

這就是'Counter'應該已經這樣做,所以他們是真正的整數或別的東西的元組? – jonrsharpe

+1

什麼是synset? – Clodion

+0

對不起,這是一個錯誤。請閱讀'syn' – dcpula

回答

1

我相信問題就行了:

c = Counter(result) 

每次迭代,你要創建一個新的計數器,如果你不是一個實例在啓動計數器,然後輸出它的事後元素,我希望你會得到你所需要的輸出:需要

from collections import Counter 
liste = [1,2,3,5,10] 
liste2 = [[1,2,3,5,10], [1,2], [1,5,10], [3,5,10], [1,2,5,10]] 
c = Counter() 
for elt in liste2: 
    syn = elt # identify each sublist of liste2 as syn 
    nTuple = len(syn) # number of elements in the syn 
    for i in liste: 
     myTuple =() 
     if syn.count(i): # check if an item of liste is in liste2 
       myTuple = (i, nTuple) 
       if len(myTuple) == 0: # remove the empty tuples 
        del(myTuple) 
       else: 
        result = myTuple 
        c[result] += 1 
for item in c.items(): 
    print(item) 

另外一個變化是,你把東西放在櫃檯上,你放什麼在裏面。見上面的代碼。

已編輯解決方案,以便它回答您的問題。

編輯,最初甚至沒有注意到你的if語句中的錯誤。如果len(myTuple)== 0實際上是多餘的,因爲在這裏不會創建空元組。你的例子中有幾條冗餘行。下面的代碼將做完全一樣的:

from collections import Counter 
liste = [1,2,3,5,10] 
liste2 = [[1,2,3,5,10], [1,2], [1,5,10], [3,5,10], [1,2,5,10]] 
c = Counter() 
for elt in liste2: 
    nTuple = len(elt) # number of elements in the syn 
    for i in liste: 
     if elt.count(i): 
       myTuple = (i, nTuple) 
       c[myTuple] += 1 
for item in c.items(): 
    print(item) 

就像我在我的評論說,你能得到這個在一個函數封裝它順利運行:

>>> from collections import Counter 
... liste = [1,2,3,5,10] 
... liste2 = [[1,2,3,5,10], [1,2], [1,5,10], [3,5,10], [1,2,5,10]] 
... def get_syncounts(liste, liste2): 
...  c = Counter() 
...  for elt in liste2: 
...   nTuple = len(elt) # number of elements in the syn 
...   for i in liste: 
...    if elt.count(i): 
...     myTuple = (i, nTuple) 
...     c[myTuple] += 1 
...  for item in c.items(): 
...   print(item) 
>>> get_syncounts(liste, liste2) 
((1, 2), 1) 
((10, 5), 1) 
((1, 3), 1) 
((5, 5), 1) 
((5, 4), 1) 
((1, 4), 1) 
((1, 5), 1) 
((10, 4), 1) 
((2, 2), 1) 
((3, 3), 1) 
((2, 5), 1) 
((5, 3), 2) 
((10, 3), 2) 
((2, 4), 1) 
((3, 5), 1) 
>>> get_syncounts(liste, liste2) 
((1, 2), 1) 
((10, 5), 1) 
((1, 3), 1) 
((5, 5), 1) 
((5, 4), 1) 
((1, 4), 1) 
((1, 5), 1) 
((10, 4), 1) 
((2, 2), 1) 
((3, 3), 1) 
((2, 5), 1) 
((5, 3), 2) 
((10, 3), 2) 
((2, 4), 1) 
((3, 5), 1) 
>>> 
+0

Grazie mille!這正是我所期待的。你節省了我的一天。 – dcpula

+0

非常歡迎。通過接受我的答案來表示您的感謝:D –

+0

然後可能將這整個事情封裝在一個函數中,以便每次運行它時計數都是新鮮的 –

0

可以追加每個結果時間在列表中,並且在附加到列表之前,您可以檢查元素是否存在於列表中。 這樣你可以避免重複。

store_results = [] 
    if result not in store_result: 
      store_result.append(result) 

,然後列表很容易轉換成一個元組

print tuple(store_results)