从列表理解中获取匹配的子列表

2024-05-21 01:18:23 发布

您现在位置:Python中文网/ 问答频道 /正文

cache = [['a', 'b'], ['c', 'd']]
val = 'a'
if val in [x for [x,y] in cache]:
    print(y)
else:
    print('Not found')

在上面的代码中,我希望返回b作为答案。但是,结果是d。如何从表达式中检索匹配项?如果我的术语不正确,请原谅,我刚开始学习Python和list理解。我更喜欢用这种速记法,因为我还不太熟悉lambda表达式。另一个好奇,为什么结果是d?在


Tags: 答案代码incacheforif表达式not
3条回答

问题在于在表达式[x for [x,y] in cache]中查找a之前,它的值是['a','c']。因此,a与其中的b无关。在

y包含d的值,因为它是迭代cache时存储在y中的最后一个值

我想你想要的是这样的:

cache = [['a', 'b'], ['c', 'd']]
val = 'a'
ys = [y for [x,y] in cache if val == x]
if ys:
    print(ys[0])
else:
    print('Not found')

这应该对列表理解起作用。在

[y for x,y in cache if x == val]
[x for [x, y] in cache]

这将创建一个临时列表['a', 'c'],用于检查val是否包含在其中。但是这个列表从来没有保存过,所以你不能真正访问它。因为这是Python2,所以列表理解中的变量(xy)实际上从表达式中泄漏出来,因此它们在之后仍然存在。但是当您循环cache时,它们的最后一个值分别是'c'和{}。在

^{pr2}$

当然,这并不是真正有用的,而且variable leaking has been fixed in Python 3(在列表理解之后,这两个变量都保持未定义状态)。在

但是要解决您的问题,您需要做的是从缓存中查找x,然后返回相应的{}。只需创建一个将x映射到y的字典,就可以做到这一点:

>>> d = {x: y for x, y in cache}
>>> d
{'a': 'b', 'c': 'd'}
>>> if val in d:
        print(d[val])
    else:
        print('Not found')

b

如果缓存始终包含两个元素的子列表,其中第一个元素用于查找内容,则最好完全切换到字典。这样,您就可以在固定时间内进行查找(这非常有用,因为您希望缓存速度更快),并且可以对其进行更多的控制(例如避免重复/旧值)。在

相关问题 更多 >