如何使用列表中的键创建字典,并将值默认为(比方说)为零?

bla*_*ter 137 python dictionary

我有a = [1,2,3,4],我想要d = {1:0, 2:0, 3:0, 4:0}

d = dict(zip(q,[0 for x in range(0,len(q))]))
Run Code Online (Sandbox Code Playgroud)

工作,但很难看.什么是更干净的方式?

Tim*_*ara 201

dict((el,0) for el in a) 会运作良好.

Python 2.7及更高版本也支持dict理解.那个语法是{el:0 for el in a}.

  • 您应该将该评论推广到您的实际答案中.此外,从Python 2.7和Python 3中,您可以执行`{el:0 for el in a}.(请随意将其添加到您的答案中.) (18认同)
  • 生成器表达式避免了填充整个列表的内存开销. (2认同)

eum*_*iro 155

d = dict.fromkeys(a, 0)
Run Code Online (Sandbox Code Playgroud)

a是列表,0是默认值.注意不要将默认值设置为某个可变对象(即列表或字典),因为它将是一个对象,用作字典中每个键的值(请在此处查看此案例的解决方案).数字/字符串是安全的.

  • 唯一的pythonic方式. (17认同)
  • Tim的解决方案适用于任何默认值(您可以使用空列表或日期时间对象或任何内容初始化字典).在我的解决方案中,您只能使用不可变对象(int/float,string,...)初始化它.对于你的情况它更加pythonic(默认值为0),很可能它也更快. (3认同)
  • 没有阅读警告:如果“0”是可变的(例如列表或字典),您会遇到麻烦,因为它都引用相同的内存位置。因此,接受的答案更安全。 (3认同)
  • 这似乎更清洁(至少对我来说),它与蒂姆相比如何呢? (2认同)
  • 在 python 3.4 `d = dict.fromkeys(set(a_list), [])` 中也有效 (2认同)

And*_*rey 11

在python版本> = 2.7和python 3中:

d = {el:0 for el in a}
Run Code Online (Sandbox Code Playgroud)


int*_*ted 8

除了蒂姆的答案,这个答案非常适合你的具体例子,值得一提的是collections.defaultdict,这可以让你做到这样的事情:

>>> d = defaultdict(int)
>>> d[0] += 1
>>> d
{0: 1}
>>> d[4] += 1
>>> d
{0: 1, 4: 1}
Run Code Online (Sandbox Code Playgroud)

对于[1, 2, 3, 4]你的例子中的映射,它是一条脱离水的鱼.但根据您提出问题的原因,这可能最终成为一种更合适的技术.


GWW*_*GWW 5

d = dict([(x,0) for x in a])
Run Code Online (Sandbox Code Playgroud)

**编辑蒂姆的解决方案更好,因为它使用了生成器,请参阅对他的回答的评论。