2016-10-26 4 views
-2

Ich importiere mehrere Wörterbücher aus einer TXT-Datei in meine Python-Datei, und dann muss ich in allen Wörterbüchern nach einem Schlüssel ('Name') suchen, aber mein Code sucht nur in der erstes Wörterbuch und gibt die Ergebnisse entsprechend aus. Ich möchte wissen, ob es einen einfachen Weg gibt, mit dieser Situation umzugehen. Sofortige Hilfe wäre willkommen. Der aktuelle Code und die Daten in TXT-Datei ist im folgenden dargestellt:Suche in einer Liste mehrerer Wörterbücher

elif option == 's': 
     if 'name' in open('data.txt').read(): 
      sea = input ("Type a menu item name to search for: ") 
      file = open('data.txt', 'r') 
      data = json.load(file) 
      file.close() 
      for index, line in enumerate(data): 
       if sea.lower() in line['name'].lower(): 
        print (index, line['name']) 
        main() 
       else: 
        print ('No such item exist') 
        main() 
     else: 
      print ("The list is empty") 
      main() 

Wörterbuch:

[ 
    { 
    "fat": 29, 
    "carbohydrates": 45, 
    "protein": 25, 
    "sodium": 1040, 
    "cholesterol": 75, 
    "calories": 540, 
    "name": "Big Mac" 
    }, 
    { 
    "fat": 47, 
    "carbohydrates": 53, 
    "protein": 33, 
    "sodium": 1410, 
    "cholesterol": 100, 
    "calories": 760, 
    "name": "Whopper" 
    }, 
    { 
    "fat": 80, 
    "carbohydrates": 50, 
    "protein": 650, 
    "calories": 45, 
    "cholesterol": 50, 
    "sodium": 50, 
    "name": "Icecream'" 
    } 
] 
+0

Willkommen bei StackOverflow. Bitte lesen und befolgen Sie die Buchungsrichtlinien in der Hilfe. [Minimales, vollständiges, überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) gilt hier. Wir können Ihnen nicht effektiv helfen, bis Sie Ihren Code veröffentlicht und das Problem genau beschrieben haben. Vor allem reicht der von Ihnen gepostete Code nicht aus, um das Problem zu reproduzieren. – Prune

Antwort

0

Das Problem ist, dass Sie Ihre erste Schleifeniterationslatenzzeit gemacht haben die ganze Welt zu sein: es sieht an der ersten Position in der Liste, meldet Erfolg oder Misserfolg bei dieser Suche allein und ruft dann das Hauptprogramm rekursiv auf (was auch eine schlechte Programmkonstruktion ist).

versuchen, etwas mit Logik auf dieser Reihenfolge:

found = False 
for index, line in enumerate(data): 
    if sea.lower() in line['name'].lower(): 
     print (index, line['name']) 
     found = True 

if not Found: 
    print ('No such item exists') 

Schließlich statt main() wickeln diese in einem während Schleife aufrufen, die die Abbruchbedingung des Programms testet.

+0

Es funktioniert, aber ich bin mir nicht sicher, welche Bedingung in die While-Schleife eingefügt werden soll. Kannst du mir bitte auch dabei helfen? –

+0

Nevermind, löste es. –

+0

Gut - weil Ihre Problembeschreibung * nichts * über die Abbruchbedingung des Programms sagt; Ich wollte gerade fragen. vielleicht ** während option! = 'q' **? – Prune

0

Wenn Sie Python 3 verwenden, können Sie eine ChainMap verwenden, die für diesen Zweck entwickelt wurde. Und wahrscheinlich ein effizienterer Algorithmus als das, was Sie verwenden.

Ich erwarte, dass es als eine "Karte von Karten" implementiert wird, wo die Karte der obersten Ebene einen konsolidierten Index der Schlüssel für jede Karte hat, die auf die ursprünglichen Einträge im Speicher zeigen. Wahrscheinlich in C implementiert. Wichtig ist, dass eine Änderung an einem Mitglied-Dict den Index im Master-Dict aktualisiert. Andernfalls müssten Sie jedes Diktat iterativ durchsuchen. Dann könnte das Nachschlagen nicht durch Sortieren usw. optimiert werden. Eine Art von Uhr kann verwendet werden, z. Wenn das zugrunde liegende C-Objekt für dict so konzipiert ist, dass es überprüft, ob es Teil der Kettenzuordnung bei Änderungen ist, und benachrichtigen.

Verwandte Themen