2016-03-21 10 views
1

Ich erstelle eine Funktion, die eine Vereinigung der Art, für einen Wert schaffen würde, wenn Sie es innerhalb der Funktion es selbst eingeben:Erste Werte aus mehrere Satz innerhalb Wörterbuch

dict = {"Mike" : {"shovel", "ball", "pool"}, 
     "Betty" : {"ball", "chair", "basket"}} 

def bought_next(customers, item): 
    for i in customers: 
     value_unit = set() 
     if item in customers[i]: 
      value1 = customers[i] 
      value1.remove(item) 
      value_unit |= value1 

    return value_unit 

Um ein wenig weiter zu erklären, mein Absicht ist, einen Satz zu machen, in dem alle Einzelteile den Einzelteilen gleich sind, die von allen Kunden gekauft werden, die den in die Funktion eingetragenen Artikel gekauft haben, abzüglich dieses Artikels natürlich. Jetzt mag ich das völlig in die falsche Richtung arbeiten, aber ich habe keine Ideen, wie ich dieses Problem lösen könnte, weil damit einfach die leere Menge zurückgegeben wird.

+0

könnten Sie das gewünschte Ergebnis für Klarheit liefern? –

+0

und haben Sie versucht, etwas in der 'if' – Ilja

+0

yeah ofc, mein schlechtes zu drucken: das gewünschte Ergebnis wäre: z. item = ball also dort wäre der output set {"schaufel", "stuhl", "pool", "korb"} – Jervis

Antwort

1

Der Fehler in Ihrem Code ist, dass Sie value_unit = set() für jeden Kunden der Reihe nach zurücksetzen. So wird Ihr Ergebnis immer nur das Ergebnis sein, das für den "letzten" Kunden gilt, nicht für alle Kunden zusammen.

Für Ihre Beispieldaten, Ihr Code in der Tat nicht nicht eine leere Menge zurückkehrt, gibt es (für mich) set(['basket', 'chair']) in Python 2 und {'shovel', 'pool'} in Python 3. So als beiseite, die zwei verschiedenen Versionen von Python über das Wörterbuch in verschiedenen Ordnungen iteriert.

In jedem Fall ist es wahrscheinlich besser, das Objekt am Ende zu entfernen als es jedes Mal zu entfernen. Ihr aktueller Code ändert das übergebene Wörterbuch, was wahrscheinlich nicht erwartet wird. Zum Beispiel könnten Sie das Ergebnis erhalten Sie so wollen:

def bought_next(customers, item): 
    value_unit = set() 
    for values in customers.values(): 
     if item in values: 
      value_unit |= values 
    return value_unit - {item} 
+0

ok es aus der for-Schleife zu verschieben ändert nichts, ich habe es versucht. – Jervis

+0

@Jervis: es aus der Schleife zu lösen behebt es für mich. Sie sollten sich Ihren Testcode genauer ansehen: Sie melden, dass leere Sätze zurückgegeben werden, wenn dies nicht der Fall ist, und dass eine Änderung keinen Unterschied macht, wenn sie es sollte. Ist Ihr Testcode * mit dem von Ihnen geposteten Code identisch? Oder gibt es einen Unterschied, der erklärt, warum Sie nicht die gleichen Ergebnisse sehen, die ich bei der Ausführung des von Ihnen geposteten Codes sehe? –

+0

Ich habe Ihren Code literal kopiert und trotzdem set() zurückgegeben. Ich habe Ausgabe 4.5.4, wenn diese helpse oder ändert nichts – Jervis

0

Ich glaube, Sie müssen so etwas wie dieses:

bought = {"Mike" : {"shovel", "ball", "pool"}, 
     "Betty" : {"ball", "chair", "basket"}} 

def bought_next(customers, item): 
    return {c: s - {item} for c, s in bought.items() if c in customers} 

Das Ergebnis:

In [6]: bought_next(['Mike', 'Betty'], 'ball') 
Out[6]: {'Betty': {'basket', 'chair'}, 'Mike': {'pool', 'shovel'}} 

By the way, es ist eine schlechte Übung, um Schlüsselwörter zu überschreiben, wie dict

Edit 1: OK, nachdem Sie Ergebnis zur Verfügung gestellt, wird korrigiert Code:

import itertools 

bought = {"Mike" : {"shovel", "ball", "pool"}, 
     "Betty" : {"ball", "chair", "basket"}} 

def bought_next(customers, item): 
    other_then_item = [s - {item} for c, s in bought.items() if c in customers] 
    return set(itertools.chain(*other_then_item)) 

bearbeiten 2. Ja, Lösung von Steve Jessop vorgesehen ist prägnanter, da es Artikel entfernt Satz in Folge hat. Dies ist ein bisschen besser:

def bought_next(customers, item): 
    all_items = [s for c, s in bought.items() if c in customers] 
    return set(itertools.chain(*all_items)) - {item} 
+0

ja, aber das ist nicht was ich hier gehen werde. Ich bekomme als Ergebnis das Wörterbuch ohne den Gegenstand, den ich hineingelegt habe. Was ich brauche, ist eine Reihe von Gegenständen, die Leute, die diesen Gegenstand gekauft haben, auch gekauft haben. – Jervis

Verwandte Themen