Verfügbare Menge aus dem Wörterbuch finden

Ich habe eine Logik geschrieben, um verfügbare Menge an Ort zu finden, für den Ort und die Menge wird mit Wörterbuch verwaltet,

d={'loc2': 500.0, 'loc3': 200.0, 'loc1': 1000.0, 'loc4': 100.0, 'loc5': 50.0} def find_combination(locations,qty): new_list = sorted(locations.items(),key=lambda y: y[1],reverse=True) result = [] while qty > 0: min_item = '' for item in new_list: if item[0] in result: continue new_diff = abs(qty - item[1]) if not min_item or new_diff <= min_diff: min_item = item[0] min_diff = new_diff min_val = item[1] result.append((min_item ,locations.get(min_item))) qty = qty - min_val return result 

Jetzt, wenn die Menge nelow die maximale Menge in der Dikt ist es gibt unerwartete Ergebnis,

 print find_combination(d,500) OUTPUT: [('loc2', 500.0)] print find_combination(d,1000) OUTPUT: [('loc1', 1000.0)] print find_combination(d,750) OUTPUT: [('loc2', 500.0), ('loc3', 200.0), ('loc5', 50.0)] print find_combination(d,1800) OUTPUT: [('loc1', 1000.0), ('loc1', 1000.0)] # unexpected 

  • Gehen Sie zurück zu starten oder wiederholen Sie rohe Eingabe eine Anzahl von Zeiten
  • "InvalidRequirement: Ungültige Anforderung, Parse error" Fehler nach dem Aktualisieren eines Python-Pakets
  • Kann ich den Python-Code mit doxygen dokumentieren (und macht es Sinn)?
  • Python kann keine Tupel in einer Funktion definieren [duplizieren]
  • So verwenden Sie den Vakuumbefehl von SQLite 3 in Python
  • Auflistung von Dateien aus einem Verzeichnis mit Glob python
  • 3 Solutions collect form web for “Verfügbare Menge aus dem Wörterbuch finden”

    Könnten Sie erklären, warum diese Ausgabe unerwartet ist? Nachdem ein loc1 Element angefügt wurde, wird der Wert der qty 800 . Die Zeile new_diff = abs(qty - item[1]) gibt bei der nächsten Iteration einen Minimalwert (200) für den Item loc1 zurück, so dass das Item noch einmal hinzugefügt wird. Sobald dies geschehen ist, wird die qty -200 , also wird die while Schleife beendet. Sollten Sie nur Artikel hinzufügen, wenn ihre zugehörige Menge kleiner ist als die variable qty ? Wenn ja, brauchst du mehr Logik, um das zu tun – man könnte die for-Schleife ändern:

     for item in [x for x in new_list if x[1] <= qty]: 

    Dies ist, was Sie wollen:

     d={'loc2': 500.0, 'loc3': 200.0, 'loc1': 1000.0, 'loc4': 100.0, 'loc5': 50.0} from operator import itemgetter def find_combination(locs,qty): locs = sorted(d.items(),key=itemgetter(1),reverse=True) #get them in descending order result = [] for loc,val in locs: if qty <= 0: #if we've reached the target qty then need to look no further break elif qty - val >= 0: #if we can take the val of a location and not go below zero do so qty -= val result.append((loc,val)) return result 

    Welche wenn du

     print find_combination(d,1800) [('loc1', 1000.0), ('loc2', 500.0), ('loc3', 200.0), ('loc4', 100.0)] >>> 

    Hat der folgende Code was du willst? Ich habe die Integer-Division benutzt, um die verbleibende Menge zu verfolgen.

    def find_combination(locations,qty): new_list = sorted(locations.items(),key=lambda y: y[1],reverse=True) result = [] for item in new_list: quotient = int(qty / item[1]) result.extend(quotient*[item]) qty -= quotient*item[1] return result
    def find_combination(locations,qty): new_list = sorted(locations.items(),key=lambda y: y[1],reverse=True) result = [] for item in new_list: quotient = int(qty / item[1]) result.extend(quotient*[item]) qty -= quotient*item[1] return result 

    EDIT: Da hast du einen Scheck benutzt, if item[0] not in result , gehe ich davon aus, dass du kein Item im Ergebnis wiederholen willst. In diesem Fall wird die Antwort von HennyH gut funktionieren. Diese Antwort wird nicht funktionieren. Aber wenn Wiederholung erlaubt ist, dann würde das funktionieren.

    Python ist die beste Programmiersprache der Welt.