【问题标题】:Creating a dictionary with same values [duplicate]创建具有相同值的字典[重复]
【发布时间】:2012-08-15 21:37:01
【问题描述】:

假设我有字典 a = {},我想得到这样的结果

value = 12
a = {'a':value,'b':value,'f':value,'h':value,'p':value}

等等许多keys:same value。现在我当然可以这样做了

a.update({'a':value})
a.update({'b':value})

等等.... 但是由于所有键的值都相同,我们难道没有更 Python 的方法来做到这一点吗?

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    你可以使用dict comprehensions(python 2.7+):

    >>> v = 12
    >>> d = {k:v for k in 'abfhp'}
    >>> print d
    {'a': 12, 'h': 12, 'b': 12, 'p': 12, 'f': 12}
    

    【讨论】:

    • 你将如何扩展它来改变一个看起来像 {'a': {'b': v}, {'c': v}, {'d': v}, 'e': {'f': v}, {'g': v}} 的字典中的值?
    【解决方案2】:

    如何使用您想要的键和默认值创建一个新字典?检查fromkeys 方法。

    >>> value=12
    >>> a=dict.fromkeys(['a', 'b', 'f', 'h', 'p'], value)
    >>> print a
    {'a': 12, 'h': 12, 'b': 12, 'p': 12, 'f': 12}
    

    【讨论】:

    • 只要值不可变就可以。否则你会遇到有趣的错误
    • @gnibbler:正确,但用户说“因为所有键的值都相同”......但我明白你的意思......我遇到了一些时髦的问题,比如>>> i=1 >>> [i+1]*5(给出 [2, 2, 2, 2, 2],而不是 [2, 3, 4, 5, 6])...
    【解决方案3】:
    >>> a=dict(zip('abfhp',[12]*len('abfhp')))
    >>> a
    {'a': 12, 'h': 12, 'b': 12, 'p': 12, 'f': 12}
    

    【讨论】:

      【解决方案4】:
      a = dict()
      for key in keys:
          a[key] = value
      

      【讨论】:

        【解决方案5】:

        正如 stummjr 所指出的,字典理解对理解和使用很有用,尤其是因为 python 中的所有内容都是字典。

        您可以考虑解决此问题的另一种方法是使用 lambda 函数。

        makeDict = lambda keys, values: { k:v for k, v in zip(keys, values) }
        makeDict( [1,2,3], list('abc') )
        ['a': 1, 'c': 3, 'b': 2]
        

        如果这增加了任何清晰度,那么 makeDict 看起来被重写为常规函数。

        def makeDict(keys, values):
            return { k:v for k, v in zip(keys, values) }
        

        无论如何,lambdas 可以玩起来很有趣,这也不是最可靠的例子。使用 zip 可能会丢失数据。两个序列的长度必须相同才能正常工作。 Python 将遍历,直到它有对来匹配两个序列。以下示例中的额外元素不应出现在字典中。

        { k:v for k, v in zip( list('abc'), [1,2,3,4]) }
        ['a': 1, 'c': 3, 'b': 2]
        

        【讨论】:

          猜你喜欢
          • 2021-12-07
          • 1970-01-01
          • 2019-03-12
          • 1970-01-01
          • 1970-01-01
          • 2021-02-21
          • 1970-01-01
          • 2020-12-18
          相关资源
          最近更新 更多