2013-09-05 11 views
27

Czy istnieje jakiś pythonic sposób przekonwertowania zestawu na dyktando?Zestaw do dyktowania Pythona

mam następujący zestaw

s = {1,2,4,5,6} 

i chcą następujące dict

c = {1:0, 2:0, 3:0, 4:0, 5:0, 6:0} 

z listą byś zrobił

a = [1,2,3,4,5,6] 
b = [] 

while len(b) < len(a): 
    b.append(0) 

c = dict(itertools.izip(a,b)) 
+0

Ściśle związane: [Większość pythonowy sposób zbudować słownik z jednolitym List] (http://stackoverflow.com/ q/14258984). –

+0

A zamiast pętli 'while' dołączającej' 0', czemu nie zrobić 'b = [0] * len (a)'? Lub użyj 'itertools.izip (a, itertools.repeat (0))'. –

+0

Szkoda, że ​​nie ma sposobu, aby korzystać z mapy i trochę lambda! – shuva

Odpowiedz

50

Korzystając dict.fromkeys():

c = dict.fromkeys(s, 0) 

Demo:

>>> s = {1,2,4,5,6} 
>>> dict.fromkeys(s, 0) 
{1: 0, 2: 0, 4: 0, 5: 0, 6: 0} 

To działa na listach, jak również; jest to najbardziej efektywna metoda tworzenia słownika z sekwencji. Uwaga: wszystkie wartości są odwołaniami do tej wartości domyślnej, którą przekazano do dict.fromkeys(), więc należy zachować ostrożność, gdy ta domyślna wartość jest obiektem zmiennym.

11

Poza metodą podaną przez @Martijn Pieters, można również użyć słownika zrozumieniem tak:

s = {1,2,4,5,6} 
d = {e:0 for e in s} 

Metoda ta jest wolniejsza niż dict.fromkeys(), ale to pozwala na ustawienie wartości w dict na wszystko, czego potrzebujesz, na wypadek, gdyby nie zawsze chciałeś, żeby było zero.

Można go również używać do tworzenia list, a listy są szybsze i bardziej pythonicowe niż pętla, którą masz w swoim pytaniu. Możesz dowiedzieć się więcej o listowe tutaj: http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions

+2

Ta metoda jest używana, jeśli wartość domyślna jest zmienna i potrzebny jest nowy obiekt dla każdego klucza. 'dict.fromkeys()' jest * daleko * szybciej w przeciwnym razie. –

+2

Zobacz [Najbardziej Pythonic Way to Build Dictionary From Single List] (http://stackoverflow.com/q/14258984) dla porównania. –

+0

Prawda, zrozumienie jest wolniejsze. – papirrin

4

Jest też inny sposób zrobić

s = {1,2,3,4,5} 
dict([ (elem, 0) for elem in s ])