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 

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.