2016-04-02 10 views
1

Ich habe ein Wörterbuch namens hash_vs_file Tasten sind file_hash Werte sind file_path (eine Liste von einem oder mehreren Dateipfaden)Filterliste von Werten in einem Wörterbuch

Ich möchte nur isolieren und zu drucken die Punkte, in denen die Liste länger als ein Dateipfad.

Ich versuche, ohne Ergebnis:

for file_hash in hash_vs_file: 
    if len(file_path) > 1 in hash_vs_file.items(): 
     print file_hash 
     print file_path 

Antwort

0

Verwenden iteritems() auf diese Weise:

for file_hash, file_path in hash_vs_file.iteritems(): 
    if len(file_path) > 1: 
     print file_path 
     print file_hash 

Da die Art und Weise ja, Sie sind nur die Schlüssel des Wörterbuchs bekommen so die Länge der file_path Überprüfung fehlschlägt.

Update:

Sie bat um die Lesbarkeit der Ausgabe. Sie können sich aus dieser Methode inspirieren:

print file_path, file_hash 

Oder diese besser ein, die auf format() beruht:

print "File Path: {} ------ File Hash: {}".format(file_path,file_hash) 

Oder, wenn Sie es wollen, wie eine Liste aussehen, versuchen Sie stattdessen:

print "[{}, {}]".format(file_path,file_hash) 
+0

Legend. das hat den Trick, und auf einer Ebene der Komplexität kann ich verstehen !. Eine Follow-up-Frage, als ich nicht nach Länge filtern wollte, und nur ** für file_hash in hash_vs_file verwendet: ** Es würde die hash_file in einer Zeile und jeden file_path in einer separaten Zeile ausgeben. Jetzt laufen alle Werte zusammen als Liste. Gibt es eine einfache Möglichkeit, diese zur besseren Lesbarkeit in separate Zeilen zu zerlegen? – Jeffnewy

+0

Überprüfen Sie meine aktualisierte Antwort. @ Jeffnewy –

0
for file_hash, file_path in hash_vs_file.items(): 
    if len(file_path) > 1: 
     print file_hash 
     print file_path 

Die Methode .items() gibt Ihnen ein Tupel von Schlüssel und Wert. Sie können dieses Tupel mit file_hash, file_path entpacken, so dass Sie in jeder Iteration auf Zugriff auf jedes file_hash und file_path haben. stattdessen

0

Alternativ können Sie die integrierte Funktion filter verwenden, um einen Iterator wie folgt zurückzugeben:

for file_hash in filter(lambda key: len(hash_vs_file[key]) > 1, hash_vs_file): 
    print("{} : {}".format(file_hash, hash_vs_file[file_hash])) 

Oder können Sie dict comprehension für ein neu gefilterten Wörterbuch verwenden:

hash_vs_file = {fhash: fpath for fhash, fpath in hash_vs_file.items() if len(fpath) > 1} 
print(hash_vs_file) 
Verwandte Themen