2016-06-12 128 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()])' –