Załóżmy, że mam słownik a = {}
i chcę mieć taki wynik
value = 12
a = {"a":value,"b":value,"f":value,"h":value,"p":value}
i tak dalej dla wielu keys:same value
. Teraz oczywiście mogę to zrobić w ten sposób
a.update({"a":value})
a.update({"b":value})
i tak dalej.... ale ponieważ wartość jest taka sama dla wszystkich kluczy, czy nie mamy do tego bardziej pythonowego podejścia?
Odpowiedzi:
18 dla odpowiedzi № 1Możesz użyć ze zrozumieniem (python 2.7+):
>>> v = 12
>>> d = {k:v for k in "abfhp"}
>>> print d
{"a": 12, "h": 12, "b": 12, "p": 12, "f": 12}
7 dla odpowiedzi nr 2
Co powiesz na utworzenie nowego słownika z kluczami, które chcesz i wartością domyślną ?. Sprawdź fromkeys metoda.
>>> value=12
>>> a=dict.fromkeys(["a", "b", "f", "h", "p"], value)
>>> print a
{"a": 12, "h": 12, "b": 12, "p": 12, "f": 12}
2 dla odpowiedzi nr 3
>>> a=dict(zip("abfhp",[12]*len("abfhp")))
>>> a
{"a": 12, "h": 12, "b": 12, "p": 12, "f": 12}
1 dla odpowiedzi nr 4
a = dict()
for key in keys:
a[key] = value
0 dla odpowiedzi № 5
Jak zauważył stummjr, rozumienie słownika jest przydatne do zrozumienia i użycia, zwłaszcza że wszystko w Pythonie jest dicitonary.
Innym sposobem rozważenia rozwiązania tego problemu jest funkcja lambda.
makeDict = lambda keys, values: { k:v for k, v in zip(keys, values) }
makeDict( [1,2,3], list("abc") )
["a": 1, "c": 3, "b": 2]
Oto, co makeDict wygląda na przepisaną jako zwykłą funkcję, jeśli to dodaje jakiejkolwiek przejrzystości.
def makeDict(keys, values):
return { k:v for k, v in zip(keys, values) }
W każdym razie lambdas mogą być zabawąwokół, również nie jest to najmocniejszy przykład. Istnieje możliwość utraty danych przy użyciu zip. Obie sekwencje muszą mieć tę samą długość, aby poprawnie działać. sekwencje W poniższym przykładzie dodatkowy element w wartościach nie powinien pojawić się w słowniku.
{ k:v for k, v in zip( list("abc"), [1,2,3,4]) }
["a": 1, "c": 3, "b": 2]