2016-11-14 2 views
0

Ich schreibe eine Funktion, wo ich ein Wörterbuch durchsuchen muss und die Schlüssel und einen Teil der Werte zurückgeben muss, die das früheste Jahr enthalten und wenn es mehr als eine Rückkehr gibt sie als eine Liste von Tupeln.Wert mit dem frühesten Jahr in einem Wörterbuch finden

Beispiel Wörterbuch:

{ 
     'V':[("Self-Portrait",1500,20.0,30.0,"oil paint","Italy")], 
     'B':[("Self-Portrait",1500,20.0,20.0,"oil paint","Italy")], 
     'K':[("Self-Portrait-1",1500,10.0,20.0,"oil paint","Netherlands"),("Self-Portrait-2",1510,10.0,20.0,"oil paint","Netherlands"),("Self-Portrait-3",1505,10.0,20.0,"oil paint","USA")], 
     'M':[("Self-Portrait-1",1800,20.0,15.0,"oil paint","USA"),("Self-Portrait-2",1801,10.0,30.0,"oil paint","France")] 
     } 

Aus diesem Wörterbuch, wenn meine Funktion für das früheste Jahr war auf der Suche (n) wäre es

earliest_year(dictionary1()) 

[('B', 'Self-Portrait'), ('K', 'SelfPortrait-1'), 
('V', 'Self-Portrait')] 

Drei der Jahre zurückkehren „1500“ waren die gleichen (und die früheste), also gab es eine Liste dieser drei Schlüssel zurück, die das erste Element des Wertes waren und den mit "1800" ignorierten. Ich habe angefangen, an Code für dieses zu arbeiten, aber ich bin nicht sicher, wie man nach dem frühesten Jahr sucht und den Fehler "unerwartetes EOF" erhält, da ich die Funktion nicht befrage, um überhaupt etwas zu tun. Jede Hilfe würde geschätzt werden

def earliest_year(dictionary): 
matches = [] 
if not dictionary: 
    return None 
for key in dictionary: 
    for record in dictionary[key]: 
+0

Warum nah? Sie können eine 'for' -Schleife nicht so ausweiden, Sie könnten ihr zumindest einen' pass' geben –

Antwort

0

Versuchen Sie es. Es findet zuerst das Mindestjahr und findet dann alle Paare, die dieses Mindestjahr haben.

def earliest_year(dictionary): 
    matches = [] 
    min_year = min(tpl[1] for lst in dictionary.values() for tpl in lst) 
    for key, lst in dictionary.items(): 
     for tpl in lst: 
      if tpl[1] == min_year: 
       matches.append((key, tpl[0])) 
    return matches 
+0

Danke, könnten Sie Beispielausgabe dafür geben? Ich teste es mit einem Wörterbuch und es scheint nur eine leere Liste zurückgeben – n00bprogrammer22

+0

Sorry, return-Anweisung fehlte. Sollte jetzt funktionieren. – yper

+0

Ich bekomme einen Fehler min() arg ist eine leere Sequenz in einem der Fälle wissen Sie, was könnte das verursachen? Es ist komisch, weil die Funktion scheint korrekt zu funktionieren – n00bprogrammer22

0

Sie ein Wörterbuch Verständnis mit einer bedingten Liste Verständnis verwenden können:

d = { 
    'B': [('Self-Portrait', 1500, 20.0, 20.0, 'oil paint', 'Italy')], 
    'K': [('Self-Portrait-1', 1500, 10.0, 20.0, 'oil paint', 'Netherlands'), 
     ('Self-Portrait-2', 1510, 10.0, 20.0, 'oil paint', 'Netherlands'), 
     ('Self-Portrait-3', 1505, 10.0, 20.0, 'oil paint', 'USA')], 
    'M': [('Self-Portrait-1', 1800, 20.0, 15.0, 'oil paint', 'USA'), 
     ('Self-Portrait-2', 1801, 10.0, 30.0, 'oil paint', 'France')], 
    'V': [('Self-Portrait', 1500, 20.0, 30.0, 'oil paint', 'Italy')]} 
} 

>>> {key: [v for v in vals if v[1] == min(v_[1] for v_ in vals)] 
    for key, vals in d.items()} 
{'B': [('Self-Portrait', 1500, 20.0, 20.0, 'oil paint', 'Italy')], 
'K': [('Self-Portrait-1', 1500, 10.0, 20.0, 'oil paint', 'Netherlands')], 
'M': [('Self-Portrait-1', 1800, 20.0, 15.0, 'oil paint', 'USA')], 
'V': [('Self-Portrait', 1500, 20.0, 30.0, 'oil paint', 'Italy')]} 
Verwandte Themen