【问题标题】:Dictionary comprehension with conditional带条件的字典理解
【发布时间】:2012-05-20 11:25:00
【问题描述】:

所以我想知道是否有人可以帮助我解决我遇到的这个问题。

假设我有一本字典:

d = {1: {2: 3}, 4: 5}

我想创建一个包含任何字典的字典:

wanted_result = {2: 3}

我正在尝试的是:

e = {inner_key: d[key][inner_key] for key in d.keys() for inner_key in d[key].keys() if isinstance(d[key], dict)}

但是,这导致我收到一个错误,指出整数没有键,我知道,但我认为我的条件会从我的示例中排除说 4 被包含在理解中。

【问题讨论】:

  • 如果嵌套的dict不止一个,结果应该是什么?如果它们嵌套得更深怎么办?
  • say started at d = {1: {2: {3: 4}, 5: 6}, 7: 8},假设得到 {2: {3: 4}, 5 : 6} 。即只收集一层深的字典

标签: python python-2.7 dictionary-comprehension


【解决方案1】:

使用 lambda 的其他方式

(lambda x: {k:v for x in d.values() if type(x) == dict for k,v in x.items()})(d)

【讨论】:

    【解决方案2】:

    我的第一个想法是这样的:

    d = {1: {2: 3}, 4: 5, 6: {7: 8}}
    generator = (x.items() for x in d.itervalues() if type(x) == dict)
    s = dict(sum( generator, list() )) 
    # s = {2: 3, 7: 8}
    

    但是,为了避免让sum() 构造一个包含所有items() 的大型临时列表,您可以改用itertools.chainiteritems()

    # chain "concatenates" iterables
    from itertools import chain
    d = {1: {2: 3}, 4: 5, 6: {7: 8}}
    s = dict(chain( *(x.iteritems() for x in d.itervalues() if type(x) == dict) ))
    # s = {2: 3, 7: 8}
    

    您应该注意边缘情况。特别是如果部分字典中有相同的键,它们必然会以某种方式崩溃。


    如果您还想支持从您的d.values() 收集dict 的子类,您可能确实希望使用isinstance 而不是type。详情请见this question

    【讨论】:

    • 你到底为什么选择_作为你的变量名? (stackoverflow.com/a/1739541/972208)
    • @julio.alegria 我偶尔将它用于临时变量(确保不要影响另一个x)。虽然不知道交互模式下的特殊语义!
    【解决方案3】:
    d = {1: {2: 3}, 4: 5,'j':{7:8}}
    e={y:d[x][y] for x in d if isinstance(d[x],dict) for y in d[x]}
    print(e)
    
    {2: 3, 7: 8}
    

    【讨论】:

    • 他不是明确要求“dictionary of any contains dictionary”吗?
    【解决方案4】:
    d = {1: {2: 3}, 4: 5, 6: {7: 8}}
    s = {k: v for elem in d.values() if type(elem) is dict for k, v in elem.items()}
    >> {2: 3, 7: 8}
    

    【讨论】:

    • 太棒了!这就是我一直在寻找的。​​span>
    【解决方案5】:

    以下列表推导将返回每个作为 dict 的值:

    >>> d = {1: {2: 3}, 4: 5}
    >>> [d[i] for i in d.keys() if isinstance(d[i],dict)]
    [{2: 3}]
    

    【讨论】:

    • 使用isinstance(),它更像pythonic。
    • 他不是明确要求“dictionary of any contains dictionary”吗?
    • 显然这是他所要求的,我只是想知道他将如何将其用于多个作为 dicts 的键。
    【解决方案6】:

    在这种情况下,我建议您使用 for 循环和 update 方法:

    d = {1: {2: 3}, 4: 5, 6: {7: 8}}
    inner_dicts = {}
    for val in d.values():
        if type(val) is dict:
            inner_dicts.update(val)
    print inner_dicts
    # {2: 3, 7: 8}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      • 1970-01-01
      • 2021-01-27
      • 2020-04-10
      • 2022-11-23
      • 2020-01-08
      • 2022-11-10
      相关资源
      最近更新 更多