Czy są jakieś istotne różnice między dict.items()
i dict.iteritems()
?
dict.items()
: Zwraca kopię listy słownika par (klucz, wartość).
dict.iteritems()
: Zwraca iterator nad parami słownika (klucz, wartość).
Jeśli uruchomię poniższy kod, wydaje się, że każdy zwraca odwołanie do tego samego obiektu. Czy brakuje mi subtelnych różnic?
#!/usr/bin/python
d={1:'one',2:'two',3:'three'}
print 'd.items():'
for k,v in d.items():
if d[k] is v: print '\tthey are the same object'
else: print '\tthey are different'
print 'd.iteritems():'
for k,v in d.iteritems():
if d[k] is v: print '\tthey are the same object'
else: print '\tthey are different'
Wynik:
d.items():
they are the same object
they are the same object
they are the same object
d.iteritems():
they are the same object
they are the same object
they are the same object
python
dictionary
python-2.x
Wilk
źródło
źródło
items()
tworzy elementy jednocześnie i zwraca listę.iteritems()
zwraca generator - generator to obiekt, który „tworzy” jeden element za każdym razem, gdynext()
jest do niego wywoływany.d[k] is v
zawsze zwraca True, ponieważ Python utrzymuje tablicę obiektów całkowitych dla wszystkich liczb całkowitych od -5 do 256: docs.python.org/2/c-api/int.html Kiedy tworzysz liczbę całkowitą w tym zakresie, po prostu odzyskam odniesienie do istniejącego obiektu:>> a = 2; b = 2 >> a is b True
Ale,>> a = 1234567890; b = 1234567890 >> a is b False
iteritems()
zmieniono naiter()
w Python 3? Powyższy link do dokumentacji wydaje się nie pasować do tej odpowiedzi.Odpowiedzi:
To część ewolucji.
Początkowo Python
items()
zbudował prawdziwą listę krotek i ją zwrócił. Może to potencjalnie zająć dużo dodatkowej pamięci.Następnie generatory zostały wprowadzone do języka w ogóle, a metoda ta została ponownie zaimplementowana jako metoda iterator-generator o nazwie
iteritems()
. Oryginał pozostaje kompatybilny wstecz.Jedną ze zmian w Pythonie 3 jest to, że
items()
teraz zwracają iteratory, a lista nigdy nie jest w pełni budowana.iteritems()
Metoda jest również usunięte, ponieważitems()
w Pythonie 3 działa podobnie jakviewitems()
w Pythonie 2.7.źródło
iteritems()
. W rzeczywistości tworzy obiekt z pełnym protokołem sekwencji, który również odzwierciedla zmiany w dyktcie (i jest wspierany przez sam dykt, a nie nadmiarową listę) - został przeniesiony do wersji 2.7 asviewitems()
.iteritems()
zawsze jest ono lepsze niżitems()
w Pythonie 2.x?dict.items()
zwraca listę 2-krotek ([(key, value), (key, value), ...]
), podczas gdydict.iteritems()
jest generatorem, który daje 2-krotki. Pierwszy z nich zajmuje początkowo więcej miejsca i czasu, ale dostęp do każdego elementu jest szybki, podczas gdy drugi zajmuje początkowo mniej miejsca i czasu, ale nieco więcej czasu na wygenerowanie każdego elementu.źródło
copy.deepcopy
). Oznacza to, że jest to kopia elementów słownika: jeśli to zrobisz,items = dct.items()
a następnie zmodyfikujeszdct
, dodając / usuwając klucze lubdct[k] = other_v
,items
pozostanie bez zmian .{1:'one', 2:'two', ... }
nad którym chcę iterować na serwerze WWW i renderować wyniki. Na jakiej skali powinienem zacząć martwić się wyborem.items()
vs.iteritems()
dla Python 2.7?W Py2.x
Komendy
dict.items()
,dict.keys()
idict.values()
zwraca kopię słownika w liście od(k, v)
pary, klucze i wartości. Może to zająć dużo pamięci, jeśli skopiowana lista jest bardzo duża.Komendy
dict.iteritems()
,dict.iterkeys()
idict.itervalues()
zwraca iterator nad słownika w(k, v)
pary, klucze i wartości.Komendy
dict.viewitems()
,dict.viewkeys()
idict.viewvalues()
zwrotu przedmiotów zobacz , co może odzwierciedlać zmiany w słowniku. (Tj. Jeślidel
dodasz element lub dodasz(k,v)
parę do słownika, obiekt widoku może się automatycznie zmienić w tym samym czasie).Podczas gdy w Py3.x
W Py3.x rzeczy są bardziej czyste, ponieważ istnieje tylko
dict.items()
,dict.keys()
idict.values()
są dostępne, które zwracają widok obiektów , tak jakdict.viewitems()
w tak Py2.x.Ale
Tak jak zauważył @lvc, obiekt widoku nie jest tym samym co iterator , więc jeśli chcesz zwrócić iterator w Py3.x, możesz użyć
iter(dictview)
:źródło
Zapytałeś: „Czy są jakieś istotne różnice między dict.items () i dict.iteritems ()”
Może to pomóc (dla Python 2.x):
Możesz zobaczyć, że
d.items()
zwraca listę krotek klucza, par wartości id.iteritems()
zwraca słownik-itemiterator.Jako listę, d.items () ma możliwość krojenia:
Ale nie miałby
__iter__
metody:Jako iterator funkcja d.iteritems () nie obsługuje wycinania:
Ale ma
__iter__
:Więc same przedmioty są takie same - pojemnik dostarczający przedmioty jest inny. Jedna to lista, druga iterator (w zależności od wersji Pythona ...)
Tak więc odpowiednie różnice między dict.items () i dict.iteritems () są takie same, jak obowiązujące różnice między listą a iteratorem.
źródło
dict.items()
zwraca listę krotek idict.iteritems()
zwraca obiekt iteratora krotki w słowniku jako(key,value)
. Krotki są takie same, ale pojemnik jest inny.dict.items()
w zasadzie kopiuje cały słownik do listy. Spróbuj użyć następującego kodu, aby porównać czasy wykonaniadict.items()
idict.iteritems()
. Zobaczysz różnicę.Dane wyjściowe w mojej maszynie:
To wyraźnie pokazuje, że
dictionary.iteritems()
jest znacznie bardziej wydajny.źródło
Jeśli masz
dict = {key1:value1, key2:value2, key3:value3,...}
W Pythonie 2 ,
dict.items()
kopiuje każdy krotki i zwraca listę krotek w słowniku tj[(key1,value1), (key2,value2), ...]
. Konsekwencją jest skopiowanie całego słownika na nową listę zawierającą krotkidict.iteritems()
zwraca iterator elementu słownika. Wartość zwracanego elementu jest również taka sama(key1,value1), (key2,value2), ...
, ale nie jest to lista. Jest to tylko obiekt iteratora elementu słownika. Oznacza to mniejsze zużycie pamięci (50% mniej).d.items() -> list(d.items())
d.iteritems() -> iter(d.items())
Krotki są takie same. Porównywałeś krotki w każdym, więc otrzymujesz to samo.
W Pythonie 3 ,
dict.items()
zwraca iterator obiektu. dict.iteritems () jest usunięty, więc nie ma już problemu.źródło
dict.iteritems
zniknął w Python3.x Więc użyj,iter(dict.items())
aby uzyskać to samo wyjście i alokację pamięciźródło
Jeśli chcesz znaleźć sposób na iterację par elementów słownika, który działa zarówno z Pythonem 2, jak i 3, spróbuj czegoś takiego:
Użyj tego w ten sposób:
źródło
dict.iteritems()
: daje iterator. Możesz użyć iteratora w innych wzorach poza pętlą.źródło
dict.iteritems () w python 2 jest równoważne dict.items () w python 3.
źródło