2010-06-04 7 views
26

W Pythonie Potrzebuję słownika obiekt, który wygląda tak:Czy jest możliwe przypisanie tej samej wartości do wielu kluczy w obiekcie Dict jednocześnie?

{'a': 10, 'b': 20, 'c': 10, 'd': 10, 'e': 20} 

byłem w stanie uzyskać to z powodzeniem łącząc funkcje dict.update() i dict.fromkeys() tak:

myDict = {} 
myDict.update(dict.fromkeys(['a', 'b', 'c'], 10)) 
myDict.update(dict.fromkeys(['b', 'e'], 20)) 

Jednakże, ponieważ kod jest napisany dla początkujących użytkowników, którzy mogą potrzebować czasem dodawać klucze/wartości, wolałbym prostą składnię w stylu "bare-bones" (podobną do Perla), taką jak:

myDict = {} 
myDict['a', 'c', 'd'] = 10 
myDict['b', 'e'] = 20 

To jednak daje mi:

myDict = {('a', 'c', 'd'): 10, ('b', 'e'): 20} 

Czy istnieje sposób mogę uprościć mój pierwszy przykład (przy użyciu dict.update() i dict.fromkeys()) dalej i uzyskać obiekt dict szukam?

Albo, alternatywnie, jeśli mam dyktafon z krotkami, tak jak w moim drugim przykładzie, czy istnieje prosty sposób, aby wykonać odnośnik taki jak myDict['c'] lub myDict.get('c') i uzyskać wartość 10?

Odpowiedz

36

Powiedziałbym, co masz jest bardzo prosty, można nieco poprawić to być:

my_dict = dict.fromkeys(['a', 'b', 'c'], 10) 
my_dict.update(dict.fromkeys(['b', 'e'], 20)) 

Jeśli klucze są krotka można zrobić:

>>> my_dict = {('a', 'c', 'd'): 10, ('b', 'e'): 20} 
>>> next(v for k, v in my_dict.items() if 'c' in k)  # use .iteritems() python-2.x 
10 

to, oczywiście zwróci pierwszą napotkaną wartość, klucz, dla którego zawiera dany element.

+3

PO powiedział, że kod jest napisany dla nowicjuszy, a to stosunkowo trudne zrozumieć po nowicjuszu. – taleinat

+8

@teleinat: więc napisz funkcję, której mogą użyć. Naprawdę mnie zniechęcasz, bo mój kod nie jest wystarczająco głupi? Mój kod używa wbudowanych metod i funkcji. Jak to nie jest podstawa?Jaki jest sens pisania kodu dla początkujących, jeśli nie zamierzają się z niego uczyć? – SilentGhost

+1

OP oczywiście wie, jak programować w Pythonie. Interpretuję jego pytanie, czy istnieje prostsze wbudowane rozwiązanie dla jego przypadku użycia, a nie to, czy można napisać taką funkcję lub osiągnąć to, czego chciał, używając złożonego kodu. Dlatego, jak rozumiem, odpowiedź SilentGhosta nie odpowiada na pytanie, więc go zignorowałem. Mój wstępny komentarz nie opisał mojego powodu do zaniechania. – taleinat

5

Pierwszym przykładem może być uproszczony za pomocą pętli:

myDict = {} 
for key in ['a', 'c', 'd']: 
    myDict[key] = 10 
for key in ['b', 'e']: 
    myDict[key] = 20 

Nie wyspecjalizowana składnia lub oszustwo, i nie mogę myśleć o niczym, co byłoby łatwiejsze do zrozumienia.

Odnośnie drugiego pytania, nie ma prostego i skutecznego sposobu wykonania wyszukiwania, jak w drugim przykładzie. Mogę myśleć tylko o iteracji kluczy (krotek) i sprawdzeniu, czy klucz jest w którymkolwiek z nich, a nie jest to, czego szukasz. Trzymaj się prostego dyktowania za pomocą odpowiednich klawiszy.

Ogólnie rzecz biorąc, jeśli celujesz w kod, który może być zrozumiany przez nowicjuszy, trzymaj się podstaw, takich jak warunki i pętle/while.

6

Dlaczego nie odziedziczyć po dyktowaniu?

class LazyDict(dict): 
    def keylist(self, keys, value): 
     for key in keys: 
      self[key] = value 

>>> d = LazyDict() 
>>> d.keylist(('a', 'b', 'c'), 10) 
>>> d 
{'a': 10, 'c': 10, 'b': 10} 

ale wolę roztworowi pętla

1

podobne do @SilentGhost ale składnia bardziej deklaratywny wolę:

myDict = { 
    **dict.fromkeys(['a', 'b', 'c'], 10), 
    **dict.fromkeys(['b', 'e'], 20) 
} 
+0

Metoda krotka nie działa dla myDict.get ("c"), o to właśnie chodziło pytanie. Ta metoda działa zgodnie z oczekiwaniami, bez dodawania kodu dostępu lub definiowania słownika. To powinna być sprawdzona odpowiedź. – rickfoosusa

Powiązane problemy