使用存储在列表中的密钥获取内部嵌套字典

时间:2018-03-16 16:46:34

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

我有这个清单:

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']

谢谢!

卢卡斯

2 个答案:

答案 0 :(得分:1)

一种方法是使用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']

答案 1 :(得分:0)

这很简单,不要让它变得复杂:

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']