How do I create a dictionary with keys from a list and values defaulting to (say) zero?
我有a = [1,2,3,4],我要d = {1:0, 2:0, 3:0, 4:0}。
1
| d = dict(zip(q,[0 for x in range(0,len(q))])) |
有效,但很难看。什么是更干净的方法?
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}。(也可以在你的答案中加上这个。)
a为列表,0为默认值。注意不要将默认值设置为某个可变对象(即list或dict),因为它将是一个对象,用作字典中每个键的值(请在此处查看此情况的解决方案)。数字/字符串是安全的。
- 唯一的Python之道。
- 这看起来更干净(至少对我来说),和蒂姆的相比怎么样?
- Tim的解决方案适用于任何默认值(您可以使用空列表或日期时间对象或任何内容初始化字典)。在我的解决方案中,只能用不可变的对象(int/float、string,…)初始化它。对于您的情况来说,它更像是Python(默认值为0),而且可能更快。
- 在python 3.4中,d = dict.fromkeys(set(a_list), [])也可以工作。
- 这是做到这一点的方法,不需要到处理解。
在python版本>=2.7和python 3中:
。
除了Tim的答案,这非常适合您的具体示例,还值得一提的是collections.defaultdict,它允许您执行如下操作:
1 2 3 4 5 6 7
| >>> d = defaultdict(int)
>>> d[0] += 1
>>> d
{0: 1}
>>> d[4] += 1
>>> d
{0: 1, 4: 1} |
号
为了像在您的示例中那样映射[1, 2, 3, 4],它是一条出水的鱼。但根据你问这个问题的原因,这可能是一种更合适的技巧。
1
| d = dict([(x,0) for x in a]) |
**编辑Tim的解决方案更好,因为它使用生成器,请参阅他回答的注释。