2016-09-27 5 views
2

Die folgende Funktion sollte ein neues Wörterbuch zurückgeben, das die Werte summiert hat.Python-Wörterbuch sumUp-Werte

import functools 
def sumUp(d): 
    for k in d: 
     d.update({k: functools.reduce(lambda x, y: x + y, d[k])}) 
    print(d) 

Wenn ich rufe Sie die Funktion wie folgt i den folgenden TypeError bekommen, was ich kann nicht verstehen, warum:

sumUp({"Ungefucht": (165, 165, 165, 255, 286.25, 255, 165, 240, 240, 150), "Malsch": (120, 240, 120, 120, 120, 120, 120), "AAA": (1, 2), "Fens": (115.20, 69.60, 28.80, 50.40), "Betti": (82.50,)}) 

Traceback (most recent call last):

File "", line 1, in

File "/home/amir/programming/python/lern.py", line 6, in sumUp print(d)

TypeError: reduce() arg 2 must support iteration

Wenn ich einen der Schlüsselwerte auslassen es funktioniert gut:

sumUp({"Ungefucht": (165, 165, 165, 255, 286.25, 255, 165, 240, 240, 150), "Malsch": (120, 240, 120, 120, 120, 120, 120), "AAA": (1, 2), "Fens": (115.20, 69.60, 28.80, 50.40)}) 

{'Malsch': 960, 'Ungefucht': 2086.25, 'Fens': 264.0, 'AAA': 3}

Warum ist die erstes Beispiel mit einem weiteren Element, das nicht wie erwartet funktioniert?

+1

Das ist sehr seltsam. Wenn Sie ein Element nach Betti hinzufügen funktioniert es – EoinS

+1

Es scheint, es hat Probleme, wenn es 5 Schlüssel-Wert-Paare gibt! – amirteymuri

+1

@Bharel scheint einen Weg gefunden zu haben, das zu tun, was Sie tun wollen, aber ich bin daran interessiert, genau herauszufinden, warum das passiert. Überprüfung der Schlüssel-Hashes jetzt – EoinS

Antwort

2

Dies funktioniert:

def sumUp(d): 
    new_d = {k: sum(v) for k, v in d.items()} 
    print(new_d) 
    return new_d 

Denken Sie daran, Sie das Wörterbuch aktualisieren, während sie über sie iterieren, die allerlei seltsame Verhalten verursacht.

Das Verhalten ist ziemlich zufällig und hängt vom Salzen der Hashes der Taste ab (die die Diktatreihenfolge ändert). Sie können es nicht konsequent 3.

Fest Dies ist der Code in Python reproduzieren:

def sumUp2(d): 
    for k in d: 
     d[k] = functools.reduce(lambda x, y: x + y, d[k]) 
    print(d) 

Er legt den Schlüssel stattdessen die dict der Aktualisierung, die sicher ist.

+0

Dies ist nicht das Problem mit 'reduce' kann es auch mit einem One-Item-Tuple arbeiten: Dieses' reduce (lambda x, y: x + y, (1,)) 'gibt das zurück:' 1'. – amirteymuri

+0

Nicht sicher, warum dies abgelehnt wurde, es ist im Wesentlichen die Antwort, –