2015-04-28 84 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'}