查找从sql查询返回的数组中的项

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查找从sql查询返回的数组中的项相关的知识,希望对你有一定的参考价值。

我有一个数组(列表?),如下所示,这是一个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)都没有成功,因为没有一个列表类似于我上面的结构。非常感谢协助!

答案

那么,你正在寻找匹配某些条件的第一条记录?你可以用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
另一答案

你需要的只是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) 
另一答案

一旦在[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

以上是关于查找从sql查询返回的数组中的项的主要内容,如果未能解决你的问题,请参考以下文章

从 PL/SQL 中的过程返回值数组

将 MySQL 内爆数组中的项目与查询中的 PHP 数组匹配

js 二分查找(Binary Search)

片段中ListView的setOnItemClickListener

从 BigQuery 中的查询返回一个数组(重复字段)

for循环遍历查找数据与sqlite数据库查找数据性能问题