如果任何值与条件匹配,则从列表推导中返回多个值

时间:2017-12-20 09:57:09

标签: python

有一系列词典:

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

2 个答案:

答案 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的答案所示。