2016-06-12 5 views
-1

Ich habe die folgende Liste, die Tupel/dicts geschachtelt hat.Iterieren durch eine Liste bestehend aus verschachtelten Tupeln/Wörterbüchern

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})}) 
     ] 

Dies ist, was ich bisher habe;

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] 

Was ich kann nicht herausfinden, wie es durch jeden Satz laufen zu machen und seine Zählung wie folgt drucken;

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

Für den Zählerwert, kann ich nur die Schlüssel zu bekommen scheinen, oder nur die Werte, sondern durch sie einen nach dem anderen nicht durchlaufen, wie oben gezeigt.

Antwort

2

Counter Objekte sind nur Wörterbücher mit extra Verhalten, so dass Sie auch dict.items() verwenden können. Allerdings würde ich hier eine andere Methode verwenden als Counter Objekte.

Schleife über die Counter.most_common() method und formatieren Sie die Tupel diese in einen String ergibt:

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

können Sie wollen Zeichenfolge mit str.format() Formatierung verwenden, um die Spaltenformatierung zu erstellen:

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() produziert Schlüssel -Wertepaare in der Reihenfolge von der höchsten Zählung zur niedrigsten.

Demo des letzteren:

>>> 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

Vielen Dank, genau das, was ich suchte. Mir war nicht klar, dass die Funktion counter most_common() dort verwendet werden könnte, sehr nützlich. – user1165419

+0

Hey, wenn du mich bei der Erstellung einer neuen Frage retten kannst, weißt du, wie ich das mit .format formatieren kannst? Ich habe versucht "{1} {0}". Format (* (kv für kv in Wert ['Wert1']. Most_common())) '. Es funktioniert nicht, aber wenn ich ein 'für kv in Wert ['Wert1'] most_common(): print" {1} {0} ". Format (* kv)' es tut. Grund ist, dass ich die Reihenfolge der% s und% d ändern möchte. – user1165419

+0

@ user1165419: Sie haben nur zwei Steckplätze in Ihrem String-Format, aber versuchen, eine * Liste von Paaren * zu übergeben. Das wird nicht funktionieren. Sie müssen einzelne Paare formatieren und dann das Ergebnis mit Kommas dazwischen verbinden: '',' .join (['{1: d} {0}'. Format (* kv) für kv in Wert ['Wert1']. most_common()]) ' –