有一系列词典:
a = [{'id': 1, 'k': 1}, {'id': 2, 'k': 2}, {'id': 3, 'k': 3}]
如果id
符合条件,如何返回k
键的值和k
的值?
尝试像:
return [i['id'], i['k'] if any(i['k'] == 2 for i in a) else fail('fail')]
答案 0 :(得分:0)
您不能使用any
,因为它会检查完整列表,如果有匹配则返回true,而不是返回匹配的特定项目。
列表理解并检查每个'k':
>>> a = [{'id': 1, 'k': 1}, {'id': 2, 'k': 2}, {'id': 3, 'k': 3}]
>>> [(x['id'], x['k']) for x in a if x['k'] == 2]
[(2, 2)]
如果多个'k'
匹配,则会返回多个值:
>>> a = [{'id': 1, 'k': 1}, {'id': 2, 'k': 2}, {'id': 3, 'k': 3}, {'id': 7, 'k':2}]
>>> [(x['id'], x['k']) for x in a if x['k'] == 2]
[(2, 2), (7, 2)]
对于缺失值,您将获得一个空列表。如果您想要“失败”或某些随机文本,而高度不推荐,请执行以下操作:
>>> [(x['id'], x['k']) for x in a if x['k'] == 9] or 'fail'
'fail'
如果你想要每个匹配的dict,那么表达式只是'x',它是列表项(dicts),它们是matche:
>>> [x for x in a if x['k'] == 2] or 'fail'
[{'k': 2, 'id': 2}, {'k': 2, 'id': 7}]
>>> [x for x in a if x['k'] == 9] or 'fail'
'fail'
答案 1 :(得分:0)
我认为你不需要在这里使用any()
,因为你只需要在每个字典中检查一个'k'
密钥,该密钥必须是唯一的。
首先将问题分解为简单的代码,然后担心列表推导:
a = [{'id': 1, 'k': 1}, {'id': 2, 'k': 2}, {'id': 3, 'k': 3}]
result = []
for d in a:
if d['k'] == 2:
result.append((d['id'], d['k']))
if result:
print(result)
else:
print('fail')
哪个输出:
[(2, 2)]
您可以从这里轻松构建工作列表理解,如@ aneroid的答案所示。