2016-06-12 170 views
-1

我有以下列表,其中嵌套元組/字典。迭代通過由嵌套元組/字典組成的列表

list1 = [ 
      ('key1', {'count': 10, 'value1': Counter({'set1': 5, 'set2': 4, 'set3': 1})}), 
      ('key2', {'count': 8, 'value1': Counter({'set1': 6, 'set2': 2})}), 
      ('key3', {'count': 7, 'value1': Counter({'set1': 5, 'set2': 2, 'set3': 1})}) 
     ] 

這是我到目前爲止;

for key, value in list1: 
    print key, value['count'], '|||', value['value1'].keys(), value['value1'].values() 

Result: 
key1 10 ||| ['set1', 'set2', 'set3'] [5, 4, 1] 
key2 8 ||| ['set1', 'set2'] [6, 2] 
key3 7 ||| ['set1', 'set2', 'set3'] [5, 2, 1] 

我弄不清楚是如何讓它遍歷每一組並打印它的計數,

key1 10 ||| set1 5, set 4, set3 1 
key2 8 ||| set1 6, set2 2 
key3 7 ||| set1 5, set2 2, set3 1 

爲計數器的值,我似乎纔拿到鑰匙或僅值,但如上圖所示,在一個時間通過他們一個不重複。

回答

2

Counter對象只是具有額外行爲的字典,所以你也可以使用dict.items()。但是,我會使用此處對象Counter獨有的其他方法。

環比Counter.most_common() method和格式化這會產生成字符串的元組:

for key, value in list1: 
    print key, value['count'], '|||', ', '.join(['%s %d' % kv for kv in value['value1'].most_common()]) 

您可能需要使用字符串str.format()格式創建列格式:

for key, value in list1: 
    print '{} {:<2d} ||| {}'.format(
     key, value['count'], 
     ', '.join(['%s %d' % kv for kv in value['value1'].most_common()])) 

Counter.most_common()產生關鍵值對從最高到最低的順序。

後者的演示:

>>> for key, value in list1: 
...  print '{} {:<2d} ||| {}'.format(
...   key, value['count'], 
...   ', '.join(['%s %d' % kv for kv in value['value1'].most_common()])) 
... 
key1 10 ||| set1 5, set2 4, set3 1 
key2 8 ||| set1 6, set2 2 
key3 7 ||| set1 5, set2 2, set3 1 
+0

非常感謝你,正是我一直在尋找。我沒有意識到Counter most_common()函數可以用在那裏,非常有用。 – user1165419

+0

嘿,通過任何機會拯救我創建一個新的問題,你知道我可以用.format格式化嗎?我已經嘗試過''{1} {0}'。格式(*(kv爲kv,值爲'value1']。most_common()))'。它不起作用,但是當我爲value ['value1']中的kv'進行操作時,most_common(): 會打印出「{1} {0}」。format(* kv)'。原因是我想改變%s和%d的順序。 – user1165419

+0

@ user1165419:您的字符串格式中只有兩個插槽,但正在嘗試傳入*對的列表*。這是行不通的。您需要格式化單個對,然後以逗號之間的逗號進行連接:'','.join(['{1:d} {0}'。format(* kv)',值爲['value1']。 most_common()])' –