2016-06-10 15 views
0

Ich versuche, einen Weg zu finden, einen Wert in einer verschachtelten Liste in einem Wörterbuch zu vergleichen. Sagen wir, ich habe diese Struktur;Iterieren durch ein Wörterbuch, das eine Liste in Listen hat

dict2 = {'key1': [ 2, ['value1', 3], ['value2', 4] ], 'key2' : [1, ['value1', 2], ['value2', 5] ], 'key3' : [7, ['value1', 6], ['value2', 2], ['value3', 3] ] } 

Lassen Sie sich jetzt für key1 sagen, dass ich durch den ersten Wert der Listen iterieren will nur für ein Datum Spiel zu suchen. Wenn meine Daten also "value2" sind und ich in key1 nach ihr suchen möchte, dann möchte ich, dass sie die '2' überspringt und das erste Objekt in den zwei Listen überprüft, die; Wert1, Wert2 für eine Übereinstimmung und das war's.

Versucht, dies zu tun, aber es gab einen Keyerror: 1;

if 'value1' in dict2[1][1:]: 
    print 'true' 
else: 
    print 'false' 

Ist dies möglich? Gibt es eine andere Möglichkeit, die Suche nach Übereinstimmungen durchzuführen? Vielen Dank.

+0

Ich schlage vor, mit list.index(), die die Position der zurück Wert/Objekt, nach dem Sie suchen. – iPhynx

+0

Der Schlüsselfehler ist, dass es keine "1" als Schlüssel gibt. Dict kann nicht indexiert werden! Sie brauchen "Schlüssel" – Merlin

Antwort

1

Wenn Sie sicher sind, dass der gegebene verschachtelt Wörterbuch immer dieses Format hat, dann können wir so etwas wie tun:

def find_value(nested_dict, value): 
    for key, nested_list in nested_dict.items(): # If Python 2, use .iteritems() instead. 
     for inner_list in nested_list[1:]: 
      if value == inner_list[0]: 
       return True 
    return False 

dict2 = {'key1': [ 2, ['value1', 3], ['value2', 4] ], 'key2' : [1, ['value1', 2], ['value2', 5] ], 'key3' : [7, ['value1', 6], ['value2', 2], ['value3', 3] ] } 

print(find_value(dict2, 'value2')) # True 
print(find_value(dict2, 'value5')) # False 
+0

Das durchläuft alle Schlüssel, ich will nur, dass es durch die Listenwerte von 'Schlüssel1' iteriert. Du kannst mein Beispiel sehen, wie ich das versucht habe (und gescheitert war), um eine Vorstellung davon zu bekommen, was ich versuche zu tun. Irgendwelche Ideen? – user1165419

0

dies stattdessen versuchen:

if 'value1' in d['key1'][1]: 
    print('Value 1 found') 

if 'value2' in d['key1'][2]: 
    print('Value 1 found') 
+0

Das durchläuft alle Schlüssel, ich möchte nur, dass es durch die Listenwerte von 'Schlüssel1' iteriert. Du kannst mein Beispiel sehen, wie ich das versucht habe (und gescheitert war), um eine Vorstellung davon zu bekommen, was ich versuche zu tun. Irgendwelche Ideen? – user1165419

+0

Siehe mein Update. . . –

+0

Danke, das funktioniert. Wie ich Bo schon gesagt habe, weißt du, ob es einen Weg gibt, nur die ersten Werte zu iterieren, d. geht durch value1, value2 (und überspringt die ganzen Zahlen) usw. Anstatt, value1, 3, value2, 4, um die Übereinstimmung zu finden? – user1165419

2

Der Code in Ihrer Frage ist Verwenden eines numerischen Index anstelle der Zeichenfolge 'key1'. Hier ist eine modifizierte Version, die funktionieren sollte:

if 'value1' in {array[0] for array in dict2.get('key1', [])[1:]}: 
    print 'true' 
else: 
    print 'false' 

Das auf alle Elemente nach dem ersten in der Reihe mit ‚key1‘ in Ihrem Wörterbuch zugeordnet aussieht, wenn es vorhanden ist.

+0

Dies iteriert durch alle Schlüssel, ich will nur, dass es durch die Listenwerte von 'key1' iteriert.Sie ​​können mein Beispiel sehen, wie ich das versucht habe (und gescheitert) eine Idee von dem, was ich versuche zu tun. Irgendwelche Ideen? – user1165419

+0

Oh, ich sehe. ''Wert1' in dict2.get ('Schlüssel1', []) [1:]' sollte dafür arbeiten. –

+0

Ich bekomme: '>>> 'value1' in dict2.get ('key1', []) [1:] Falsche' – user1165419

0

Wenn Sie nur in den Listen der Suche können Sie etwas tun:

for key, value in my_dict.items(): 
    for item in value: 
     if isintance(item, list): 
      if desired_value in item: 
       return item # Here it is! 
0

Try this:

for x,v in dict2.items(): 
    if x == "key1": 
    for i, e in enumerate(v): 
     try: 
      if e[0] == 'value2': 
       print "True" 
      else: print "False" 
     except:pass 
Verwandte Themen