我有一个数组(列表?),如下所示,这是sql查询的结果。
lstLineRouteKey = [('1203/1000/2', 1, 'DVN 1000'), ('1212/1000/2', 2, 'RKS 1000'), ('1189/1000/2', 3, 'USH 1000'), ('1201/1000/2', 4, 'ANA 1000'), ('1232/1000/2', 5, 'CLB 1000'), ('1207/1000/2', 6, 'HRY 1000'), ('1162/1000/2', 7, 'LBR 1000')]
我要做的是找到'1212/1000/2'的第一个(唯一)实例并检索它右边的值,2。
我已经设法用下面的for循环来做到这一点,但效率非常低,因为它循环遍历整个列表,即使找到匹配后也是如此。
for id,row in enumerate(lstLineRouteKey):
lst = list(row)
for id,s in enumerate(lst):
if lst[0] == '1212/1000/2':
ID = str(lst[1]);
我迄今为止找到的方法(.find,.map)都没有成功,因为没有一个列表与上面的结构类似。非常感谢协助!
答案 0 :(得分:2)
那么,您是否正在寻找符合某些条件的第一个记录?您可以使用next
。
>>> next(x[1] for x in lstLineRouteKey if x[0] == '1212/1000/2')
2
next
的优势在于它非常高效。它会耗尽生成器表达式,返回满足该表达式的第一个值。如果不需要,next
将不会遍历整个列表。
为了可视化发生的事情,请考虑生成K元素列表的y = [x[1] for x in lstLineRouteKey if x[0] == '1212/1000/2']
形式的列表理解。在这种情况下,next
将返回y[0]
的值。实际上,中间列表是不是生成的!这就是它有效的原因。
如果记录不存在,next
可能会引发StopIteration
。在这种情况下,将默认参数传递给next
。这是一个例子
>>> print(next((x[1] for x in lstLineRouteKey if x[0] == '1212/1000/3'), None))
None
答案 1 :(得分:1)
您需要的只是break
声明:
它终止最近的封闭循环,如果循环有一个,则跳过可选的else子句。
您可以在代码中使用它,如:
lstLineRouteKey = [('1203/1000/2', 1, 'DVN 1000'), ('1212/1000/2', 2, 'RKS 1000'), ('1189/1000/2', 3, 'USH 1000'), ('1201/1000/2', 4, 'ANA 1000'), ('1232/1000/2', 5, 'CLB 1000'), ('1207/1000/2', 6, 'HRY 1000'), ('1162/1000/2', 7, 'LBR 1000')]
my_result = None
for line_route in lstLineRouteKey:
if line_route[0] == '1212/1000/2':
my_result = line_route[1]
break # on reaching here, your for loop will be terminated
# (no further execution)
答案 2 :(得分:0)
一旦您在[0]
中找到与tuple
匹配的项目符合您的查询,您就可以将索引[1]
的值分配给ID
并突破循环
lstLineRouteKey = [('1203/1000/2', 1, 'DVN 1000'), ('1212/1000/2', 2, 'RKS 1000'), ('1189/1000/2', 3, 'USH 1000'), ('1201/1000/2', 4, 'ANA 1000'), ('1232/1000/2', 5, 'CLB 1000'), ('1207/1000/2', 6, 'HRY 1000'), ('1162/1000/2', 7, 'LBR 1000')]
ID = ''
for x, y, z in lstLineRouteKey:
if x == '1212/1000/2':
ID = str(y)
break