2016-06-12 21 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 

は、私が唯一のキーや値のみを取得するように見えるが、上記のように一度に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

は私が探していたまさに、どうもありがとうございました。私はカウンターmost_common()関数は、非常に便利な、そこに使用することができた実現しませんでした。 – user1165419

+0

新しい質問を作成して私を救う機会があれば、どうやって.formatでフォーマットすることができるかも知っていますか?私は '{1} {0} 'を試しました。format(* kv値[' value1 ']。most_common()))'。それはうまくいきませんが、私は ''値1 'のkvのために '' most_common(): "{1} {0}"フォーマット(* kv) 'を表示します。理由は、%sと%dの順序を変更したいのです。 – user1165419

+0

@ user1165419:文字列形式のスロットは2つしかありませんが、ペア*のリストを渡そうとしています。それは動作しません。個々のペアを書式設定し、その結果をカンマで区切り、kv値['value1']の ''、 '.join([' {1:d} {0} '。 most_common()]) ' –

関連する問題