如何从列表中创建字典

3

假设我有一个列表,如何创建一个字典,其中列表中的对象是键,我会选择一个值作为默认值。例如:

inp : [a,b,c]
out : {a:1,b:1,c:1}

我能想到的全部就是这个:

dict={}
list=['a','b','c']
for obj in list:
    dict[obj]=1

有没有更加简洁的方式呢?谢谢。

1
尝试在Python中使用列表推导式。 - mugabits
2个回答

7
您可以使用fromkeys,因为整数是不可变的
d = dict.fromkeys(l, 1)

示例:

In [6]: l = ['a','b','c']

In [7]: dict.fromkeys(l, 1)
Out[7]: {'a': 1, 'b': 1, 'c': 1}

为什么不可变性很重要可以通过使用一个可变对象作为值,例如列表来看出:

In [10]: d = dict.fromkeys(l, [])

In [11]: d["a"].append("foo")

In [12]: d
Out[12]: {'a': ['foo'], 'b': ['foo'], 'c': ['foo']}

可变值将被共享。

您也可以使用字典推导式,这对于可变或不可变的值都是安全的:

d = {k: [] for k in l}
d = {k: 1 for k in l}

@limitless,别担心,当你的值是不可变的时候,每个键都会创建一个新对象,这没问题,但如果它们不是不可变的,请不要这样做,除非你真的想共享对象。 - Padraic Cunningham
有没有一种快速的方法来预填可变对象,比如以不会将它们绑在一起的方式初始化空数组?原始的for循环是最好的方法吗? - mix3d
1
@mix3d,字典推导式可用于可变和不可变值,k : v 中的每个 v 都会创建一个新对象,前提是 v 在其他地方没有被引用。 - Padraic Cunningham

1
你也可以这样做:

>>> lst = ['a','b','c']
>>> dict(zip(lst,[1]*len(lst)))
{'a': 1, 'c': 1, 'b': 1}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接