2017-02-03 3 views
3

Ich versuche, ein Wörterbuch mithilfe einer Funktion zu aktualisieren, die ein Tupel zurückgibt, wobei das erste Element eine Zeichenfolge ist.Das Wörterbuch wird nicht mit einer Zeichenfolge als Schlüssel aktualisiert

>>> def t(): 
...  return 'ABC', 123 

Allerdings die dict.update Funktion gefällt es nicht ganz.

>>> d = {} 
>>> d.update(t()) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: dictionary update sequence element #0 has length 3; 2 is required 

Ich kann auch Wörterbuch Verständnis versuchen und das gleiche unerwartete Ergebnis erhalten.

>>> d.update({k: v for k, v in t()}) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 1, in <dictcomp> 
ValueError: too many values to unpack (expected 2) 

Die einzige funktionierende Möglichkeit besteht darin, zuerst den zurückgegebenen Wert zu speichern.

>>> x = t() 
>>> d.update({x[0]: x[1]}) 
>>> d 
{'ABC': 123} 

Wie erklärt man das?

Antwort

5

Vom docs

update() akzeptiert entweder ein anderes Wörterbuch Objekt oder ein iterable von Schlüssel/Wert-Paare (wie Tupeln oder andere Iterables Längen zwei). Wenn Schlüsselwortargumente angegeben sind, wird das Wörterbuch mit diesen Schlüssel/Wert-Paaren aktualisiert: d.update(red=1, blue=2).

Zum Beispiel:

In [1]: d = {} 

In [2]: def t(): return [('ABC', '123')] 

In [3]: d.update(t()) 

In [4]: d 
Out[4]: {'ABC': '123'} 

In [5]: d2 = {} 

In [6]: def t2(): return {'ABC': '123'} 

In [7]: d2.update(t2()) 

In [8]: d2 
Out[8]: {'ABC': '123'} 
+0

Mein Missverständnis kam von der Tatsache, dass eine iterierbare Länge zwei (d. H. '(A, b)') es schaffen würde. Tatsächlich erwartet die "update" -Funktion eine iterierbare Anzahl von Iterablen der Länge zwei (d. H. "[(A, b)]"). – Spack

1

@ Antwort Jack ist die eine.

Sowohl Ihre fehlerhafte Beispiele, verwenden Sie ein Paar statt eine Folge von Paaren.

auch nur etwas Soße hinzufügen, hier sind zwei weitere Möglichkeiten, es zu tun:

def t(): 
    return 'ABC', 123 
d = {} 
d.update([ t() ]) 
d 
=> {'ABC': 123} 
d = {} 
d.__setitem__(*t()) 
d 
=> {'ABC': 123} 
1

Selbst einfach mehr, t() ändern, um eine {key: value} als solche zurückzukehren: do

def t(): 
    return {'ABC': 123} 

Sollte der Trick für dich.

Verwandte Themen