2024-05-21 01:18:23 发布
网友
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?在
b
d
问题在于在表达式[x for [x,y] in cache]中查找a之前,它的值是['a','c']。因此,a与其中的b无关。在
[x for [x,y] in cache]
a
['a','c']
y包含d的值,因为它是迭代cache时存储在y中的最后一个值
y
cache
我想你想要的是这样的:
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,所以列表理解中的变量(x和y)实际上从表达式中泄漏出来,因此它们在之后仍然存在。但是当您循环cache时,它们的最后一个值分别是'c'和{}。在
['a', 'c']
val
x
'c'
当然,这并不是真正有用的,而且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
如果缓存始终包含两个元素的子列表,其中第一个元素用于查找内容,则最好完全切换到字典。这样,您就可以在固定时间内进行查找(这非常有用,因为您希望缓存速度更快),并且可以对其进行更多的控制(例如避免重复/旧值)。在
问题在于在表达式
[x for [x,y] in cache]
中查找a
之前,它的值是['a','c']
。因此,a
与其中的b
无关。在y
包含d
的值,因为它是迭代cache
时存储在y
中的最后一个值我想你想要的是这样的:
这应该对列表理解起作用。在
这将创建一个临时列表}。在
^{pr2}$['a', 'c']
,用于检查val
是否包含在其中。但是这个列表从来没有保存过,所以你不能真正访问它。因为这是Python2,所以列表理解中的变量(x
和y
)实际上从表达式中泄漏出来,因此它们在之后仍然存在。但是当您循环cache
时,它们的最后一个值分别是'c'
和{当然,这并不是真正有用的,而且variable leaking has been fixed in Python 3(在列表理解之后,这两个变量都保持未定义状态)。在
但是要解决您的问题,您需要做的是从缓存中查找}。只需创建一个将
x
,然后返回相应的{x
映射到y
的字典,就可以做到这一点:如果缓存始终包含两个元素的子列表,其中第一个元素用于查找内容,则最好完全切换到字典。这样,您就可以在固定时间内进行查找(这非常有用,因为您希望缓存速度更快),并且可以对其进行更多的控制(例如避免重复/旧值)。在
相关问题 更多 >
编程相关推荐