代码之家  ›  专栏  ›  技术社区  ›  user225312

从iterable创建字典

  •  11
  • user225312  · 技术社区  · 14 年前

    从iterable创建字典并为其分配一些默认值的最简单方法是什么?我试过:

    >>> x = dict(zip(range(0, 10), range(0)))
    

    但这不起作用,因为范围(0)并不像我想象的那样是不可测的(但我还是尝试过!)

    那我该怎么办呢?如果我这样做:

    >>> x = dict(zip(range(0, 10), 0))
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: zip argument #2 must support iteration
    

    这也不管用。有什么建议吗?

    4 回复  |  直到 11 年前
        1
  •  17
  •   Jeff Mercado    11 年前

    在Python3中,您可以使用听写理解。

    >>> {i:0 for i in range(0,10)}
    {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0}
    

    幸运的是,这已经在python 2.7中进行了反向移植,所以也可以在那里使用。

        2
  •  16
  •   user225312    14 年前

    你需要 dict.fromkeys 方法,它完全满足您的需要。

    来自文档:

    fromkeys(...)
        dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.
        v defaults to None.
    

    所以你需要的是:

    >>> x = dict.fromkeys(range(0, 10), 0)
    >>> x
    {0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0}
    
        3
  •  2
  •   Matthew Flaschen    14 年前

    纸浆小说提供了一种实用的方法。但是为了兴趣,您可以使用 itertools.repeat 对于重复的0。

    x = dict(zip(range(0, 10), itertools.repeat(0)))
    
        4
  •  1
  •   martineau Nae    14 年前

    您可以考虑使用 defaultdict 标准库的子类 collections 模块。通过使用它,您甚至不需要迭代ITerable,因为与指定默认值相关联的键将在第一次访问它们时被创建。

    在下面的示例代码中,我插入了一个免费的 for 循环以强制创建其中一些语句,以便下面的print语句具有要显示的内容。

    from  collections import defaultdict
    
    dflt_dict = defaultdict(lambda:42)
    
    # depending on what you're doing this might not be necessary...
    for k in xrange(0,10):
        dflt_dict[k]  # accessing any key adds it with the specified default value
    
    print dflt_dict.items()
    # [(0, 42), (1, 42), (2, 42), (3, 42), ... (6, 42), (7, 42), (8, 42), (9, 42)]