我有这个清单:
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']
谢谢!
卢卡斯
答案 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']