【问题标题】:Get inner nested dictionary with key stored in list使用存储在列表中的键获取内部嵌套字典
【发布时间】:2018-08-25 19:39:27
【问题描述】:

我有这个清单:

n = ['FAKE0.0.1.8', '10.2.2.22', '10.2.182.10', '10.2.20.5', '10.2.94.135', '10.2.110.1', '10.2.94.73', '10.2.20.1', '10.2.94.38', '10.2.94.37', '10.2.7.121']

还有这本词典:

i = {'10.2.94.38': {'area': '0.0.1.8'}}

如您所见,列表中只有一项,它是字典的有效键:10.2.94.38

如果我执行以下操作,我可以获得内部字典{'area':'0.0.1.8'}

>>> [i.get(x,'NA') for x in n]
['NA', 'NA', 'NA', 'NA', 'NA', 'NA', 'NA', 'NA', {'area': '0.0.1.8'}, 'NA', 'NA']

如果我执行以下操作,我可以像往常一样获得值0.0.1.8

>>> i[n[8]]['area']
'0.0.1.8'

我面临的问题是我无法达到终极价值0.0.1.8。我尝试了以下方法但没有成功:

>>> [i.get(x['area'],'NA') for x in n]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <listcomp>
TypeError: string indices must be integers

我该怎么做?我想要达到的最终结果是:

['NA', 'NA', 'NA', 'NA', 'NA', 'NA', 'NA', 'NA', '0.0.1.8', 'NA', 'NA']

谢谢!

卢卡斯

【问题讨论】:

  • xx['area'] 的字符串,而不是字典
  • 我不关注。你能详细说明一下可能吗?
  • for x in n 其中n 是您的列表,x 是列表项(字符串)

标签: python python-3.x list dictionary nested


【解决方案1】:

这个很简单,不要复杂:

n = ['FAKE0.0.1.8', '10.2.2.22', '10.2.182.10', '10.2.20.5', '10.2.94.135', '10.2.110.1', '10.2.94.73', '10.2.20.1', '10.2.94.38', '10.2.94.37', '10.2.7.121']
i = {'10.2.94.38': {'area': '0.0.1.8'}}

print([i[x]['area'] if x in i else 'NaN' for x in n])

输出:

['NaN', 'NaN', 'NaN', 'NaN', 'NaN', 'NaN', 'NaN', 'NaN', '0.0.1.8', 'NaN', 'NaN']

如果你只想要值,那么你也可以过滤结果:

n = ['FAKE0.0.1.8', '10.2.2.22', '10.2.182.10', '10.2.20.5', '10.2.94.135', '10.2.110.1', '10.2.94.73', '10.2.20.1', '10.2.94.38', '10.2.94.37', '10.2.7.121']
i = {'10.2.94.38': {'area': '0.0.1.8'},'10.2.2.22':{'area': '0.0.1.9'}}


print(list(map(lambda x:i[x]['area'],filter(lambda x:x in i,n))))

输出:

['0.0.1.9', '0.0.1.8']

【讨论】:

    【解决方案2】:

    一种方法是使用try / except

    n = ['FAKE0.0.1.8', '10.2.2.22', '10.2.182.10', '10.2.20.5', '10.2.94.135',
         '10.2.110.1', '10.2.94.73', '10.2.20.1', '10.2.94.38', '10.2.94.37', '10.2.7.121']
    
    i = {'10.2.94.38': {'area': '0.0.1.8'}}
    
    def try_get_all(i, n):
        for j in n:
            try:
                yield i[j]['area']
            except KeyError:
                yield 'NA'
    
    res = list(try_get_all(i, n))
    
    # ['NA', 'NA', 'NA', 'NA', 'NA', 'NA', 'NA', 'NA', '0.0.1.8', 'NA', 'NA']
    

    【讨论】:

    • 有了这个我只能得到0.0.1.8的值。问题是我的最终输出应该是 len(n) 的列表,如果与字典不匹配,则包含项目 NA 或值 0.0.18 如果匹配...
    • 嗨!对不起,但更新后我只得到&gt;&gt;&gt; try_get(i_set, n_set) '0.0.1.8'.... :-( ...我应该得到类似['NA', 'NA', 'NA', 'NA', 'NA', 'NA', 'NA', 'NA', '0.0.1.8', 'NA', 'NA']
    • 你是对的。这就是我更新它的原因……抱歉更新晚了。讨论后我意识到我需要别的东西......而且你的建议很有效。非常感谢!
    • @LucasAimaretto,没问题,我已经为您进一步简化了解决方案:)。
    猜你喜欢
    • 2021-05-10
    • 2021-04-28
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    相关资源
    最近更新 更多