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 

  • Duplikat aus dem Wörterbuch entfernen, ohne den Schlüssel zu entfernen
  • Lesen von Dateien in Wörterbücher
  • Python dict update diff
  • Multiplizieren und dann Summieren von Werten aus zwei Wörterbüchern
  • Zusammenführen von 2 Liste von Dicts auf der Grundlage gemeinsamer Werte
  • Rekursiver Zugang zu Wörterbuch und Modifikation
  • Python sql liste ins Wörterbuch umwandeln
  • Warum musst du .iteritems () anrufen, wenn du über ein Wörterbuch in Python itert?
  • 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.