2016-05-06 10 views
0

sieht Meine Daten wie folgt aus:Wie finde ich den höchsten KEY-Wert des niedrigsten positiven VALUE von einem bestimmten SUBKEY?

{ 
    'test1462477941.log': { 'end_diff': 537, 
           'file_epoch': 1462477941, 
           'start_diff': -33}, 
    'test1462478161.log': { 'end_diff': 317, 
           'file_epoch': 1462478161, 
           'start_diff': 284}, 
    'test1462478346.log': { 'end_diff': 132, 
           'file_epoch': 1462478346, 
           'start_diff': 99}, 
} 

Was ich will ist die niedrigste, positiv „start_diff“ Wert in einem der Schlüssel zu tun zu finden und die relative Top-Level-Schlüssel (der Dateiname) drucken. Die Datenstruktur wirft mich allerdings ein wenig aus.

Wenn die Daten über Verwendung shoud es finden und ausdrucken:

test1462478346.log 

Gibt es eine elegante Art und Weise, dies zu tun? Wenn nicht, werde ich alles nehmen

Antwort

1

Verwenden filter für nicht positiv zu entfernen und min mit key für die Suche:

a = { 
    'test1462477941.log': {'end_diff': 537, 
          'file_epoch': 1462477941, 
          'start_diff': -33}, 
    'test1462478161.log': {'end_diff': 317, 
          'file_epoch': 1462478161, 
          'start_diff': 284}, 
    'test1462478346.log': {'end_diff': 132, 
          'file_epoch': 1462478346, 
          'start_diff': 99}, 
} 

only_positive_start_diff = filter(lambda x: x[1]['start_diff'] > 0, a.items()) 
min_start_diff = min(only_positive_start_diff, key=lambda x: x[1]['start_diff']) 

print min_start_diff[0] # Min log file 

Ohne lambda ist es wie folgt aussehen:

def only_positive(x): 
    return x[1]['start_diff'] > 0 

def min_start(x): 
    return x[1]['start_diff'] 

only_positive_start_diff = filter(only_positive, a.items()) 
min_start_diff = min(only_positive_start_diff, key=min_start) 

print min_start_diff[0] 
+0

Danke! Ich teste das jetzt. Gibt es einen expliziteren Weg, dies zu tun, ohne Lambda zu verwenden, nur um zu verstehen, was besser läuft? (Immer noch versucht, Lambda zu erfassen) – Thisisstackoverflow

+0

@Thisstackoverflow Lesen Sie über Lambda-Funktionen in anderen Quellen. In der Tat gibt es nichts Kompliziertes. Aber füge den Code ohne Lambda hinzu – JRazor

1

Dies ist eine Lösung mit eingebaute Funktion reduce:

import sys 
filename, start_diff = reduce(
    lambda curMin, item: 
     curMin if item[1]['start_diff']<0 or item[1]['start_diff']>curMin[1] else (item[0], item[1]['start_diff']), 
    inputDict.iteritems(), 
    ('not_found.log', sys.maxint)) 

print filename 

Bitte beachten Sie, dass der Code mit Python 2.7 geschrieben ist. Wenn Sie Python 3.x verwenden, sollten Sie die Reduzierungsfunktion in functools finden, und dict.iteritems() wurde in dict.items() geändert.

Verwandte Themen