2013-07-09 9 views
18

starałem się zaktualizować wartości w moim słowniku, natknąłem się na 2 sposoby, aby to zrobić:Aktualizacja metoda w słowniku Pythona

product.update(map(key, value)) 

product.update(key, value) 

Jaka jest różnica między nimi?

+2

Druga metoda zgłasza błąd typu: 'TypeError: update oczekiwano co najwyżej 1 argument, otrzymałem 2'. –

+9

Co jest nie tak z 'product [key] = value'? – Koterpillar

+2

Pierwsza metoda również zgłasza błąd, mówiąc, że drugi parametr ("wartość") musi obsługiwać iterację. – Koterpillar

Odpowiedz

37

Różnica polega na tym, że druga metoda nie działa:

>>> {}.update(1, 2) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: update expected at most 1 arguments, got 2 

dict.update() spodziewa się znaleźć iterowalny par klucz-wartość, argumentów, słów kluczowych, lub innego słownika:

Update the dictionary with the key/value pairs from other, overwriting existing keys. Return None .

update() accepts either another dictionary object or an iterable of key/value pairs (as tuples or other iterables of length two). If keyword arguments are specified, the dictionary is then updated with those key/value pairs: d.update(red=1, blue=2) .

map() jest wbudowaną metodą, która tworzy sekwencję przez zastosowanie elementów drugiego (i kolejnych) argumentów do pierwszego argumentu, który musi być możliwy do wywołania. O ile twój obiekt key nie jest wywoływalny, a obiekt value jest sekwencją, twoja pierwsza metoda również się nie powiedzie.

Demo sprawnego map() aplikacji:

>>> def key(v): 
...  return (v, v) 
... 
>>> value = range(3) 
>>> map(key, value) 
[(0, 0), (1, 1), (2, 2)] 
>>> product = {} 
>>> product.update(map(key, value)) 
>>> product 
{0: 0, 1: 1, 2: 2} 

Tutaj map() tylko produkuje pary klucz-wartość, która spełnia dict.update() oczekiwania.

+1

dla' map() 'czy mogę użyć' str' jako obiektu wywoływalnego, na przykład: 'dict.update (map ('Name') , "John")) '? –

+2

Nie, nie możesz. Ponieważ obiekty 'str' nie są wywoływalne. Działają tylko funkcje i obiekty z metodą "__call__". –

+4

Jednakże mogę to zrobić: 'dict.update ({'Name': 'John'})' –