【问题标题】:Python nested dict comprehensionPython嵌套字典理解
【发布时间】:2011-06-06 01:12:22
【问题描述】:

有人可以解释如何进行嵌套的字典推导吗?

>> j = dict(((x+y,0) for x in 'cd') for y in 'ab')
>> {('ca', 0): ('da', 0), ('cb', 0): ('db', 0)}

我会喜欢的:

>> j
>> {'ca':0, 'cb':0, 'da':0, 'db':0}

谢谢!

【问题讨论】:

    标签: python dictionary list-comprehension


    【解决方案1】:
    dict((x+y,0) for x in 'cd' for y in 'ab')
    

    【讨论】:

    • 太好了,我很高兴这可以简化。
    【解决方案2】:
    dict((x+2*y, 0) for x in range(1,4,2) for y in range(15, 18, 2))
    

    顺便说一句,我们所说的 dict 理解类似于以下内容,仅在 Python2.7+ 中可用:

    {x+2*y:0 for x in range(1,4,2) for y in range(15, 18, 2)}
    

    【讨论】:

      【解决方案3】:

      您可以使用 itertools 中的笛卡尔积将其简化为一个循环

      >>> from itertools import product
      >>> j=dict((x+y,0) for x,y in product('cd','ab'))
      >>> j
      {'cb': 0, 'ca': 0, 'db': 0, 'da': 0}
      >>> 
      

      【讨论】:

        【解决方案4】:

        问题中额外的括号引入了另一个生成器表达式,它产生 2 个生成器,每个生成器产生 2 个元组。下面的列表理解准确地显示了正在发生的事情。

        >>> [w for w in (((x+y,0) for x in 'cd') for y in 'ab')]
        [<generator object <genexpr> at 0x1ca5d70>, <generator object <genexpr> at 0x1ca5b90>]
        

        列表推导式而不是生成器表达式显示了上面的生成器包含的内容

        >>> [w for w in ([(x+y,0) for x in 'cd'] for y in 'ab')]
        [[('ca', 0), ('da', 0)], [('cb', 0), ('db', 0)]]
        

        这就是为什么你得到两个元组对的键值。

        为什么 mouad 的回答有效

        >>> [w for w in ((x+y,0) for x in 'cd' for y in 'ab')]
        [('ca', 0), ('cb', 0), ('da', 0), ('db', 0)]
        

        在 Python 2.7 和 3.0 及更高版本中,您可以使用字典推导

        >>> j = {x+y:0 for x in 'cd' for y in 'ab'}
        >>> j
        {'cb': 0, 'ca': 0, 'db': 0, 'da': 0}
        

        【讨论】:

          猜你喜欢
          • 2013-07-28
          • 1970-01-01
          • 2013-11-30
          • 2021-07-24
          • 2017-11-27
          • 2016-11-25
          • 2020-10-13
          • 2021-01-28
          相关资源
          最近更新 更多