2016-03-19 6 views
1

Ich suche nach einer Lösung, Schlüssel in einem Wörterbuch gemäß einer Liste als Wert zu suchen, und später die Schlüssel an eine Liste von Tupeln anzufügen. Ich bin in der Lage, nach den richtigen Schlüsseln zu suchen, kann aber keine Möglichkeit finden, die Liste zu erstellen, die ich erwarte. Schätze für freundliche Hilfe.Kombinieren von Schlüsseln im Verzeichnis in Tupel in einer Liste

Wie unten, würde Ich mag alle Schlüssel in d finden, die einen Wert gleich in der Liste auf das Element hat l und weiter setze alle Tasten in eine Liste von Tupeln gesucht wie in erwarteter Ausgabe gezeigt.

d = {'acutrar': 'acutrar', 
'aguosa': 'aguoso', 
'capitalizareis': 'capitalizar', 
'conocerán': 'conocer', 
'conociéremos': 'conocer', 
'conocían': 'conocer', 
'conocías': 'conocer', 
'conozcas': 'conocer', 
'pales': 'palar', 
'planeareis': 'planear', 
'planearás': 'planear', 
'planeasteis': 'planear', 
'planeáramos': 'planear'} 

l = ['conocer', 'NOT FOUND', 'NOT FOUND', 'planear'] 

for word in l: 
    for (x,y) in d.items(): 
     if y == word: 
      print(word, x) #I can only search for the keys but don't know how to build that list of tuples 

Erwartete Ausgabe:

[('conocerán','conocías','conozcas','conocían','conociéremos'),('NOT FOUND'),('NOT FOUND'),('planeáramos','planeareis','planearás','planeasteis')] 

Antwort

2

Ihr Ergebnis überraschend eine Mischung von Schlüsseln und Werten.

{w:tuple(k for (k,v) in d.items() if v == w) for w in l} 

für

{'conocer': ('conocías', 'conozcas', 'conociéremos', 'conocerán', 'conocían'), 
'NOT FOUND':(), 
'planear': ('planeareis', 'planeáramos', 'planeasteis', 'planearás')} 
:

Eine homogene Lösung kann durch

[tuple(k for (k,v) in d.items() if v == w) for w in l] 

für

[('conocías', 'conozcas', 'conociéremos', 'conocerán', 'conocían'), 
(), 
(), 
('planeareis', 'planeáramos', 'planeasteis', 'planearás')] 

oder erhalten werden,

1

Um Ihre erwartete Ausgabe zu erhalten, können Sie die Liste von Tupeln wie diese bauen:

for word in l: 
    hits = tuple() 
    for (x,y) in d.items(): 
     if y == word: 
      hits += (x,) 
    if not hits: 
     hits = ('NOT FOUND',) 
    results.append(hits) 

print(results) 
1

Erste keine Notwendigkeit, auf der Liste der zu such iterieren Werte IMO.

Sie könnten nur tun:

final = [] 

for k, v in d.items(): 
    if v in l: 
     final.append(k) 
final = tuple(final) 

Aber man könnte auch über eine Liste Verständnis vereinfachen es wie folgt:

final = tuple(k for k, v in d.items() if v in l) 
6

Warum verwandeln nicht das Wörterbuch in einem geeigneteren/bequem Struktur und führen Sie die O (1) Lookups nach Schlüssel statt Schleife über alle Elemente und Suche nach dem Wert:

from collections import defaultdict 

d = {'acutrar': 'acutrar', 
'aguosa': 'aguoso', 
'capitalizareis': 'capitalizar', 
'conocerán': 'conocer', 
'conociéremos': 'conocer', 
'conocían': 'conocer', 
'conocías': 'conocer', 
'conozcas': 'conocer', 
'pales': 'palar', 
'planeareis': 'planear', 
'planearás': 'planear', 
'planeasteis': 'planear', 
'planeáramos': 'planear'} 


t = defaultdict(list) 
for key, value in d.items(): 
    t[value].append(key) 

l = ['conocer', 'NOT FOUND', 'NOT FOUND', 'planear'] 

print([t.get(item, [item]) for item in l]) 

Drucke:

[ 
    ['conozcas', 'conociéremos', 'conocías', 'conocerán', 'conocían'], 
    ['NOT FOUND'], 
    ['NOT FOUND'], 
    ['planeáramos', 'planearás', 'planeareis', 'planeasteis'] 
] 
1
d = {'acutrar': 'acutrar', 
'aguosa': 'aguoso', 
'capitalizareis': 'capitalizar', 
'conocerán': 'conocer', 
'conociéremos': 'conocer', 
'conocían': 'conocer', 
'conocías': 'conocer', 
'conozcas': 'conocer', 
'pales': 'palar', 
'planeareis': 'planear', 
'planearás': 'planear', 
'planeasteis': 'planear', 
'planeáramos': 'planear'} 

l = ['conocer', 'NOT FOUND', 'NOT FOUND', 'planear'] 

temp_list = [] 
final_list = [] 

for word in l: 
    temp_list = [] 
    for (x,y) in d.items(): 
     if y == word: 
      temp_list.append(x) 
    if len(temp_list) == 0: 
     temp_list.append(word) 
    final_list.append(tuple(temp_list)) 

print final_list 
Verwandte Themen