Moja próba programowego utworzenia słownika list nie pozwala mi na indywidualne adresowanie kluczy słownika. Za każdym razem, gdy tworzę słownik list i próbuję dołączyć do jednego klucza, wszystkie z nich są aktualizowane. Oto bardzo prosty przypadek testowy:
data = {}
data = data.fromkeys(range(2),[])
data[1].append('hello')
print data
Aktualny rezultat: {0: ['hello'], 1: ['hello']}
Spodziewany wynik: {0: [], 1: ['hello']}
Oto, co działa
data = {0:[],1:[]}
data[1].append('hello')
print data
Rzeczywisty i oczekiwany wynik: {0: [], 1: ['hello']}
Dlaczego fromkeys
metoda nie działa zgodnie z oczekiwaniami?
python
list
dictionary
Martin Burch
źródło
źródło
fromkeys()
metoda zamiast tego akceptowała funkcję fabryczną, więc moglibyśmy przekazać jąlist
jako funkcję, a ta funciton byłaby wywoływana raz dla każdego utworzonego klucza, ale to nie jest rzeczywisty interfejs API programudict.fromkeys()
.Zamiast tego użyj defaultdict :
from collections import defaultdict data = defaultdict(list) data[1].append('hello')
W ten sposób nie musisz wcześniej inicjalizować wszystkich kluczy, których chcesz użyć na listach.
W Twoim przykładzie jest używana jedna (zmienna) lista:
alist = [1] data = dict.fromkeys(range(2), alist) alist.append(2) print data
wyjdzie
{0: [1, 2], 1: [1, 2]}
.źródło
list
tutaj nie jest pusta lista, ale typ (lub myślę, że można to zobaczyć jako konstruktor wywoływalny). Dlatego za każdym razem, gdy przekazywany jest brakujący klucz, tworzona jest nowa lista zamiast ponownego używania tej samej.Zapełniasz swoje słowniki odwołaniami do pojedynczej listy, więc po jej zaktualizowaniu aktualizacja jest odzwierciedlana we wszystkich odniesieniach. Zamiast tego spróbuj rozumieć ze słownika. Zobacz Tworzenie słownika ze zrozumieniem list w Pythonie
d = {k : v for k in blah blah blah}
źródło
v
w tej odpowiedzi?Możesz użyć tego:
data[:1] = ['hello']
źródło