2015-04-28 79 views
2

我想從列表和固定變量創建一個字典。我知道zip()可以從兩個列表創建一個字典,但我怎樣才能使它適應攝入一個固定的變量?從Python中的列表和固定變量創建字典

什麼工作:

countries = ["Italy", "Germany", "Spain", "USA", "Switzerland"] 
dishes = ["pizza", "sauerkraut", "paella", "Hamburger"] 
country_specialities = zip(countries,dishes) 

我需要什麼:

dishes = ["pizza", "sauerkraut", "paella", "Hamburger"] 
country = "uk" 

爲了輸出:

menu = ["pizza": "uk", "sauerkraut": "uk", "paella": "uk", "Hamburger", "uk"] 
+0

你嘗試過什麼在做什麼?例如,用四個''uk''列出一個列表似乎非常簡單,那麼您可以像之前一樣將它傳遞給'zip'。 – jonrsharpe

+0

我用這些值作爲例子,真正的列表有近200,000個值 – algorhythm

回答

6
{dish: country for dish in dishes} 
+0

字典理解實際上是矯枉過正,而不是當你可以在這裏簡單地使用'dict.fromkeys(盤子,國家)'(這會更快)。 –

5

可以使用dict.fromkeys() class method這裏:

dict.fromkeys(dishes, country) 

注意,你應該使用這種這裏默認是一個可變值(除非你的意思是分享所有的按鍵之間是可變的值)。

從文檔:

創建密鑰的新字典從序列和值設置爲

fromkeys()是一種返回新字典的類方法。 默認爲None

這將比使用字典理解更快;循環使用dishes完全在C代碼中完成,而dict理解則會在Python字節碼中執行循環。

如果您的列表將會包含200.000值,然後,使一個巨大的差別:

>>> from timeit import timeit 
>>> import random 
>>> from string import ascii_lowercase 
>>> values = [''.join([random.choice(ascii_lowercase) for _ in range(random.randint(20, 40))]) for _ in range(200000)] 
>>> def dictcomp(values): 
...  return {v: 'default' for v in values} 
... 
>>> def dictfromkeys(values): 
...  return dict.fromkeys(values, 'default') 
... 
>>> timeit('f(values)', 'from __main__ import values, dictcomp as f', number=100) 
4.984026908874512 
>>> timeit('f(values)', 'from __main__ import values, dictfromkeys as f', number=100) 
4.159089803695679 

那重複操作100次,當是這兩個選項之間的差異幾乎是一秒鐘。

2

你可以這樣做:

dishes = ["pizza", "sauerkraut", "paella", "Hamburger"] 
country = "uk" 
menu = dict((dish, country) for dish in dishes) 
1

擴大與你zip

In [54]: dict(zip(dishes, [country] * len(dishes))) 
Out[54]: {'Hamburger': 'uk', 'paella': 'uk', 'pizza': 'uk', 'sauerkraut': 'uk'}