【问题标题】:How to initialize a dict with keys from a list and empty value in Python?python - 如何使用列表中的键和Python中的空值初始化dict?
【发布时间】:2011-01-15 13:27:32
【问题描述】:

我想从中得到:

keys = [1,2,3]

到这里:

{1: None, 2: None, 3: None}

有pythonic的方法吗?

这是一种丑陋的做法:

>>> keys = [1,2,3]
>>> dict([(1,2)])
{1: 2}
>>> dict(zip(keys, [None]*len(keys)))
{1: None, 2: None, 3: None}

【问题讨论】:

    标签: dictionary python


    【解决方案1】:

    dict.fromkeys([1, 2, 3, 4])

    这实际上是一个类方法,所以它也适用于字典子类(如collections.defaultdict)。可选的第二个参数指定用于键的值(默认为 None。)

    【讨论】:

    • 小心初始化可变的东西:如果你调用,例如,dict.fromkeys([1, 2, 3], []),所有的键都映射到同一个列表,修改一个会修改它们。
    • 使用{k:[] for k in [1, 2, 3]} 初始化仍然是安全的。
    【解决方案2】:

    没人愿意提供听写理解的解决方案吗?

    >>> keys = [1,2,3,5,6,7]
    >>> {key: None for key in keys}
    {1: None, 2: None, 3: None, 5: None, 6: None, 7: None}
    

    【讨论】:

    • 我相信它已被向后移植到 2.7
    • 这很好,并且不会像接受的答案那样受到参考问题的影响。
    • 这也允许你指定一个默认值(例如False)。
    • 这是 Python3 IMO 中最干净、最 Pythonic 的方式
    • 使用 dict-comp 还允许将值作为调用函数的结果(如果需要,可以将键作为参数传递)——这是一种非常强大的机制。
    【解决方案3】:
    dict.fromkeys(keys, None)
    

    【讨论】:

    • 太棒了,我想要空列表,dict.fromkeys(keys, [])
    • @muon 这几乎肯定不是你想要的,请参阅charleslparker comment
    • 适用于 Python 2.6.6 版。
    • 注意:这将初始化dict,所有键都指向相同的单个值
    【解决方案4】:
    >>> keyDict = {"a","b","c","d"}
    
    >>> dict([(key, []) for key in keyDict])
    

    输出:

    {'a': [], 'c': [], 'b': [], 'd': []}
    

    【讨论】:

    • 虽然此代码可以回答问题,但提供有关 如何 和/或 为什么 解决问题的附加上下文将改善答案的长期价值。
    • 名称keyDict 具有误导性,因为第一行代码返回set,而不是dict
    • 它们可能会被映射到同一个列表中
    【解决方案5】:
    d = {}
    for i in keys:
        d[i] = None
    

    【讨论】:

    • 为什么 Python 会抛出如下错误:TypeError: 'type' object is not iterable?
    • @FrancescoCastellani 因为list 是一种类型。除非你有list = []之类的东西,否则上面的方法总是会给你同样的错误
    【解决方案6】:

    许多工作流程中,您希望为任意键附加默认/初始值,您不需要提前单独对每个键进行哈希处理。您可以使用collections.defaultdict。例如:

    from collections import defaultdict
    
    d = defaultdict(lambda: None)
    
    print(d[1])  # None
    print(d[2])  # None
    print(d[3])  # None
    

    这更有效,它不必在实例化时散列所有密钥。此外,defaultdictdict 的子类,因此通常不需要转换回常规字典。

    对于您需要对允许的键进行控制的工作流程,您可以根据接受的答案使用dict.fromkeys

    d = dict.fromkeys([1, 2, 3, 4])
    

    【讨论】:

      猜你喜欢
      • 2011-12-26
      • 2019-01-08
      • 2020-04-09
      • 2018-01-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多