python - 创建一个列表,其中包含另一个列表中的字典值
问题描述
我有一本字典,可以将人们与他们的技能联系起来:
d = {
'A': {'name': 'Peter', 'skill': 'python'},
'B': {'name': 'Mary', 'skill': 'c#'},
'C': {'name': 'James', 'skill': 'java'}
}
我有一个列表,其中指定了不同任务所需的技能:
e = [
['python', 'java'],
['c#', 'R']
]
我需要生成一个新列表,其中包含具有所需技能的人员姓名(如果没有找到,则为“N/A”)。在这种情况下,结果将是:
rslt= [['Peter', 'James'], ['Mary', 'N/A']]
以下 for 循环生成结果。
# with for loops
for r in range(len(e)):
for s in range(0,len(e[r])):
skill_found = 'false'
for k in d.keys():
if e[r][s] == d[k]['skill']:
rslt[r][s] = d[k]['name']
skill_found = 'true'
break
if skill_found == 'false':
rslt[r][s] = 'N/A'
print(rslt)
但是,我真的很想获得一些列表/字典理解来做同样的事情,我一直失败。以下两个语句会产生垃圾:
#with list/dict comprehension
lstComp1 = [[d[k]['name'] if str(e[y][x]) == d[k]['skill'] else 'N/A' for x in range(0, len(e[y])) for k in d.keys()] for y in range(len(e))]
lstComp2 = [[x if x in d else 'N/A' for x in range(len(e[y]))] for y in range(len(e))]
print( lstComp1)
print(lstComp2)
非常感激任何的帮助。
解决方案
@andrej 的回答很好。我已经为任何人写了这个python3.x
_any
只是一个模仿,any
但在这里它返回一个字典以使事情变得更容易。
def _any(d,val):
for v in d.values():
if v['skill']==val:
return v
return {'name':'N/A'}
[[_any(d,v)['name'] for v in lst] for lst in e]
# [['Peter', 'James'], ['Mary', 'N/A']]
推荐阅读
- html - 如何在父元素之外扩展flex容器
- angular - 'ObjectUnsubscribedError object unsubscribed' on valueChanges in custom validator over form
- git - 将更改还原到特定提交
- node.js - 使用 nodejs 和 aws 遇到 403 错误
- javascript - 如何从未命名的 JSON 对象数组中获取数据
- mongodb - 如何计算位于多个数组中的不同对象
- css - 如何使两个 Flex 列表现得像 CSS 中的表格?
- domain-driven-design - 实体真的只能属于一个聚合吗?
- php - 如何在 Magento 2 中从 ui 组件表单获取数据到控制器
- bash - 无法在 Terraform 中运行 shell 脚本