2013-09-05 46 views
27

是否有任何pythonic的方式来将一个集合转换为字典?设置为字典Python

我得到了以下设置

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

,并希望下面的字典

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

一个列表,你会做

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

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

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

密切相关:[最Python的方式来构建字典从单列表(http://stackoverflow.com/ q/14258984)。 –

+0

而不是'while'循环追加'0',为什么不使'b = [0] * len(a)'?或者使用'itertools.izip(a,itertools.repeat(0))'。 –

+0

我希望有一种方法可以使用地图并做一些lambda! – shuva

回答

50

使用dict.fromkeys()

c = dict.fromkeys(s, 0) 

演示:

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

这适用于列表为好;从序列创建字典是最有效的方法。请注意,所有值都是对您传递给dict.fromkeys()的那一个默认值的引用,因此当该默认值是可变对象时要小心。

11

除了通过@Martijn Pieters给出的方法,你也可以使用字典的理解是这样的:

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

这种方法比dict.fromkeys()慢,但它可以让你在字典中设置的值无论你需要什么,以防万一你不希望它为零。

您也可以使用它来创建列表,列表的解析速度更快,而且更像python,它代表了您在问题中存在的循环。您可以了解更多关于内涵这里: http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions

+2

如果默认值是可变的,并且您需要每个键的新对象,则这是使用的方法。 'dict.fromkeys()'在其他情况下会更快*。 –

+2

请参阅[从单个列表中建立字典的大多数Pythonic方法](http://stackoverflow.com/q/14258984)进行比较。 –

+0

确实,理解速度较慢。 – papirrin

4

这也是另一种方法做

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