【问题标题】:Extract all keys in the second level of nested dictionary提取第二级嵌套字典中的所有键
【发布时间】:2017-08-12 15:49:18
【问题描述】:

我想提取二维字典第二级中的所有键,但 python 解释器返回 NameError。我的预期结果是 ['aa', 'bb', 'cc', 'aaa', 'bbb', 'ccc']

>>> adict
defaultdict(<class 'dict'>, {'b': {'aaa': 444, 'ccc': 666, 'bbb': 555}, 'a': {'aa': 111, 'cc': 333, 'bb': 222}})

>>> all = [ele for ele in adict[ww].keys() for ww in ['a', 'b']]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'ww' is not defined

【问题讨论】:

    标签: python dictionary


    【解决方案1】:
    adict = {'b': {'aaa': 444, 'ccc': 666, 'bbb': 555}, 'a': {'aa': 111, 'cc': 333, 'bb': 222}}
    
    [key for nested_dict_key, nested_dict_value in adict.iteritems() for key, value in nested_dict_value.iteritems()]
    

    【讨论】:

      【解决方案2】:

      你已经接近了。你只需要重新排序你的循环:

      all = [ele for ww in ['a', 'b'] for ele in adict[ww] ]
      

      要了解原因,请考虑如何编写一个普通的 for 循环:

      all = []
      for ww in ['a', 'b']:
          for ele in adict[ww]:
              all.append(ele)
      

      请注意循环的顺序保持不变。另外,我已经放弃了.keys(),这不是必需的,因为默认情况下dict 上的迭代发生在键上。


      You can also be awesome like Jon Clements 并这样做:

      In [265]: set().union(*adict.values())
      Out[265]: {'aa', 'aaa', 'bb', 'bbb', 'cc', 'ccc'}
      

      *adict.values() 返回一个内部字典列表,其键被解包然后添加到集合中。一些建议:

      1. 订单不保证(即使在 python3.6 上)

      2. 删除重复项

      【讨论】:

      • set().union(*adict.values()) 之类的东西也可能适合...(它将所有键提取为一个集合而不是一个列表 - 如果您不想指定确切的键并且不要'不想重复)
      • 注意:也不需要调用.keys(),而且可能很昂贵(Py2)。另外:set(itertools.chain.from_iterable(adict.values())) 也可以。
      猜你喜欢
      • 1970-01-01
      • 2014-11-27
      • 2017-01-07
      • 2019-04-25
      • 1970-01-01
      • 2016-05-15
      • 2014-12-06
      • 1970-01-01
      • 2022-10-16
      相关资源
      最近更新 更多