【问题标题】:How do I create a dictionary with keys from a list and values defaulting to (say) zero? [duplicate]如何使用列表中的键和默认为零的值创建字典? [复制]
【发布时间】:2011-04-21 15:13:12
【问题描述】:

我有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))]))

有效但丑陋。什么是更清洁的方式?

【问题讨论】:

    标签: python dictionary


    【解决方案1】:
    d = dict([(x,0) for x in a])
    

    **edit Tim 的解决方案更好,因为它使用生成器,请参阅对他的回答的评论。

    【讨论】:

      【解决方案2】:

      dict((el,0) for el in a) 会很好用。

      Python 2.7 及更高版本也支持字典推导。该语法是{el:0 for el in a}

      【讨论】:

      • 生成器表达式避免了填充整个列表的内存开销。
      • 您可能应该将该评论推广到您的实际答案中。此外,从 Python 2.7 和 Python 3 开始,您可以使用 {el:0 for el in a}。 (也可以随意将其添加到您的答案中。)
      【解决方案3】:

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

      >>> d = defaultdict(int)
      >>> d[0] += 1
      >>> d
      {0: 1}
      >>> d[4] += 1
      >>> d
      {0: 1, 4: 1}
      

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

      【讨论】:

        【解决方案4】:
        d = dict.fromkeys(a, 0)
        

        a 是列表,0 是默认值。注意不要将默认值设置为某个可变对象(即 list 或 dict),因为它将是一个对象,用作字典中每个键的值(请查看 here 以获得这种情况的解决方案)。数字/字符串是安全的。

        【讨论】:

        • 唯一的pythonic方式。
        • 这似乎更干净(至少对我来说),它与蒂姆的相比如何?
        • Tim 的解决方案适用于任何默认值(您可以使用空列表或日期时间对象或任何东西来初始化字典)。在我的解决方案中,您只能使用不可变对象(int/float、string、...)对其进行初始化。它更适合您的情况(默认值为 0),而且很可能它也更快。
        • 在 python 3.4 d = dict.fromkeys(set(a_list), []) 也可以使用
        • 没有阅读警告,如果0 是可变的(例如列表或字典),你会遇到麻烦,因为它都指向同一个内存位置。因此,接受的答案更安全。
        【解决方案5】:

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

        d = {el:0 for el in a}
        

        【讨论】:

          猜你喜欢
          • 2013-07-19
          • 1970-01-01
          • 2014-08-12
          • 2023-02-24
          • 1970-01-01
          • 1970-01-01
          • 2016-08-26
          • 2021-02-03
          • 2018-01-14
          相关资源
          最近更新 更多