2016-11-26 4 views
0

Ich habe folgende Python-Wörterbuch:die Schlüssel in einem Python-Wörterbuch für Kreuzung der Elemente in dem entsprechenden Wörterbuch Finding Werte

{(a,b,c): [(1, 2, 3), (4, 5, 6)], (d,e,f):[(7,8,9)] ,(m, n, o): [(1, 2, 3), (7, 8, 9)]} 

Ich versuche, die Schlüssel entsprechend dem Schnittpunkt der Tupelelemente innen zu finden die Liste in dem folgenden Format:
Für das tuple (1,2,3), sollte der Schnittpunkt den Ausgang als geben:

(a,b,c), (m,n,o) 

Obwohl es möglich ist, über jedes der Tupel Elemente innerhalb der Liste iterieren wie Um den Wörterbuchwert zu finden und den entsprechenden Schlüssel zu finden, suche ich nach einem pythonischen Weg, dies zu erreichen.

Antwort

2
>>> dic = {('a','b','c'): [(1, 2, 3), (4, 5, 6)], ('d','e','f'):[(7,8,9)] ,('m', 'n', 'o'): [(1, 2, 3), (7, 8, 9)]} 
>>> [i for i in dic if (1,2,3) in dic[i]] 
[('a', 'b', 'c'), ('m', 'n', 'o')] 
>>> 

Wenn Sie nicht wollen, durchlaufen, können Sie filter

>>> list(filter(lambda x:(1,2,3) in dic[x],dic)) 
[('a', 'b', 'c'), ('m', 'n', 'o')] 

verwenden Wenn Sie ein schicken Modul-Liebhaber sind, Verwenden itertools.takewhile.

>>> from itertools import takewhile 
>>> list(takewhile(lambda x:(1,2,3) in dic[x],dic)) 
[('a', 'b', 'c'), ('m', 'n', 'o')] 

Am Ende wird keiner der oben genannten Dinge richtig machen, ohne die Sammlung intern/extern zu durchlaufen. Diese schicken Module sind eine Art Wrapper, machen mehr oder weniger dasselbe unter der Haube.

+0

„, obwohl es möglich ist, über jeden des Tupelelemente in der Liste als Wörterbuch Wert iterieren und den entsprechenden Schlüssel finden, ich bin für einen pythonic Weg suchen, um Dies erreichen." – Arman

+1

@Arman, ich denke nicht, dass es kein pythonischer Weg ist. Für mich will er einfach keine for/while-Schleife, das ist es. –

+0

Aber Sie iterieren über jedes Tupel Elemente, aber OP bittet darum, dies nicht tun, bin ich falsch? – Arman

0

Ihr ursprüngliches Wörterbuch hat einen Syntaxfehler, es sei denn, die Variablen a, b, c usw. wurden zuvor definiert. Aber hier ist eine Antwort:

[key for key in d if (1,2,3) in d[key]] 
+0

das ist genau das, was das OP nicht will, weil er das schon probiert hat. –

+0

@ ssj.luffy Es ist aus dem ursprünglichen Post nicht klar, was genau versucht wurde. Es ist nur Ihre Interpretation der OP-Frage. Erstens erfordert jede Listensuche Iteration oder Rekursion, sogar filterbasiert. Zweitens glaube ich, dass die von mir vorgeschlagene Lösung am meisten Pythonic ist. – DyZ

0

Wahrscheinlich filter() ist eine der Optionen:

d = {('a','b','c'): [(1, 2, 3), (4, 5, 6)], ('d','e','f'):[(7,8,9)] ,('m', 'n', 'o'): [(1, 2, 3), (7, 8, 9)]} 

def find_keys(my_dict, value): 
    l = lambda x: value in my_dict[x] 
    return list(filter(l, my_dict)) 

result = find_keys(d, (1, 2, 3)) 
0

Wenn Sie invertieren das Wörterbuch von Listen:

d = {('a','b','c'): [(1, 2, 3), (4, 5, 6)], ('d','e','f'):[(7,8,9)] ,('m', 'n', 'o'): [(1, 2, 3), (7, 8, 9)]} 

i = {} 
for k,v in d.items(): 
    for e in v: 
    i.setdefault(e, []).append(k) 

Der Inhalt i:

>>> i 
{(4, 5, 6): [('a', 'b', 'c')], (7, 8, 9): [('d', 'e', 'f'), ('m', 'n', 'o')], (1, 2, 3): [('a', 'b', 'c'), ('m', 'n', 'o')]} 

Sie können für (1,2,3) wie diese Abfrage:

>>> i[(1,2,3)] 
[('a', 'b', 'c'), ('m', 'n', 'o')] 
+0

für eine einzige Abfrage, ist Ihre Lösung ein bisschen zu dramatisch. Aber, es ist definitiv nützlich, wenn OP einige Lookup benötigt. Es verwendet zwei For-Schleife, die von einigen Leuten beschwert wurde (besonders unter meiner Antwort).Es ist trotzdem eine lahme Logik. Insgesamt ist Ihre Lösung ziemlich nett. –

Verwandte Themen