Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较两个不同大小的列表并保留Python中条件为真的项?_Python_List_Performance_Loops_Nested Lists - Fatal编程技术网

比较两个不同大小的列表并保留Python中条件为真的项?

比较两个不同大小的列表并保留Python中条件为真的项?,python,list,performance,loops,nested-lists,Python,List,Performance,Loops,Nested Lists,我正在编写代码,从对象检测模型对边界框执行非最大值抑制。我有一个地理定位边界框的主列表,它是geologited_注释的嵌套列表=[[(x1,y1),(x2,y2),(x3,y3),(x4,y4)]]坐标。(x3,y3)和(x4,y4)坐标是边界框的地理位置。我在我的深度学习模型中使用了一个嵌入式NMS函数,结果是keep=[[x1,y1,x2,y2]]坐标的嵌套列表。keep中的结果没有最后两个坐标,因为嵌入函数没有考虑地理位置 我想将keep列表与geologited_注释列表进行比较,从k

我正在编写代码,从对象检测模型对边界框执行非最大值抑制。我有一个地理定位边界框的主列表,它是
geologited_注释的嵌套列表=[[(x1,y1),(x2,y2),(x3,y3),(x4,y4)]]
坐标。(x3,y3)和(x4,y4)坐标是边界框的地理位置。我在我的深度学习模型中使用了一个嵌入式NMS函数,结果是
keep=[[x1,y1,x2,y2]]
坐标的嵌套列表。
keep
中的结果没有最后两个坐标,因为嵌入函数没有考虑地理位置

我想将
keep
列表与
geologited_注释
列表进行比较,从
keep
中找到所有(x1,y1)和x2,y2)坐标,这些坐标等于
geologited_注释中的(x1,y1)和(x2,y2)坐标。
keep
中的这两个坐标与
geologited\u注释中的地理位置坐标相关联,因此如果(x1,y1)和(x2,y2)值相等,则主列表中的(x3,y3)和(x4,y4)值可以与它们关联。我需要以一个包含所有四个(x1,y1)、(x2,y2)、(x3,y3)和(x4,y4)坐标的列表结束

我有一个半工作代码,但它在最终列表中保留的坐标比
keep
列表中的坐标多。循环遍历所有坐标也需要很长时间

这两个列表的一个更全面的示例:

geolocated_annotations=[[(624169.99807, 4344801.75893), (624170.64013, 4344801.34655), (624159.5841700002, 4344797.0139500005), (624159.1195900001, 4344797.0139500005)], [(624159.9808900001, 4344799.4673500005), (624160.4089300002, 4344799.4673500005), (624160.4089300002, 4344798.887930001), (624159.9808900001, 4344798.887930001)]]

keep=[[624169.99807, 4344801.75893, 624170.64013, 4344801.34655],
 [624151.50361, 4344753.26513, 624151.93165, 4344752.69093],
 [624150.44917, 4344812.13107, 624150.88243, 4344811.58297]]
这是我的起始代码:

bboxes_keep=[]
for i in geolocated_annotations:
        for j in keep:
             if i[0][0]==j[0] and i[0][1]==j[1] and i[1][0]==j[2] and i[2][1]==j[3]:
                bboxes_keep.append(i)
预期产出示例:

bboxes_keep=[[(624169.99807, 4344801.75893), (624170.64013, 4344801.34655), (624159.5841700002, 4344797.0139500005), (624159.1195900001, 4344797.0139500005)]]

关于如何使我的代码更加精炼和准确,有什么想法吗?

一般来说,字典查找是开始优化此类问题的最简单方法。因为您有成对的浮点,所以在另一个dict中包含dict的数据存储是实现快速查找的一种方法。我的示例将其与try/except配对,这样,如果x或y不匹配,就会引发异常。请注意,数据存储也是这样设置的:如果有多个点具有相同的x坐标,则所有可能的y值都将在一个键下的字典中

geolocated_annotations=[[(624169.99807, 4344801.75893), (624170.64013, 4344801.34655), (624159.5841700002, 4344797.0139500005), (624159.1195900001, 4344797.0139500005)], [(624159.9808900001, 4344799.4673500005), (624160.4089300002, 4344799.4673500005), (624160.4089300002, 4344798.887930001), (624159.9808900001, 4344798.887930001)]]

    keep=[[624169.99807, 4344801.75893, 624170.64013, 4344801.34655],
 [624151.50361, 4344753.26513, 624151.93165, 4344752.69093],
 [624150.44917, 4344812.13107, 624150.88243, 4344811.58297]]

datastore = {}

for i in keep:

    try:
        datastore[i[0]][i[1]] = True
    except:
        datastore[i[0]] = {i[1]:True} 
    try:
        datastore[i[2]][i[3]] = True
    except:
        datastore[i[2]] = {i[3]:True}

result = []
for row in geolocated_annotations:
    for x,y in row:
        try:
            match = datastore[x][y]
            result.append([x,y])
        except:
            pass

注意:我不得不对这两个列表的结构做一些假设,因为正如评论员所指出的,您的示例中似乎有一些错误。如果我的假设不正确,请修复您的代码并让我知道

一般来说,字典查找是开始优化此类问题的最简单方法。因为您有成对的浮点,所以在另一个dict中包含dict的数据存储是实现快速查找的一种方法。我的示例将其与try/except配对,这样,如果x或y不匹配,就会引发异常。请注意,数据存储也是这样设置的:如果有多个点具有相同的x坐标,则所有可能的y值都将在一个键下的字典中

geolocated_annotations=[[(624169.99807, 4344801.75893), (624170.64013, 4344801.34655), (624159.5841700002, 4344797.0139500005), (624159.1195900001, 4344797.0139500005)], [(624159.9808900001, 4344799.4673500005), (624160.4089300002, 4344799.4673500005), (624160.4089300002, 4344798.887930001), (624159.9808900001, 4344798.887930001)]]

    keep=[[624169.99807, 4344801.75893, 624170.64013, 4344801.34655],
 [624151.50361, 4344753.26513, 624151.93165, 4344752.69093],
 [624150.44917, 4344812.13107, 624150.88243, 4344811.58297]]

datastore = {}

for i in keep:

    try:
        datastore[i[0]][i[1]] = True
    except:
        datastore[i[0]] = {i[1]:True} 
    try:
        datastore[i[2]][i[3]] = True
    except:
        datastore[i[2]] = {i[3]:True}

result = []
for row in geolocated_annotations:
    for x,y in row:
        try:
            match = datastore[x][y]
            result.append([x,y])
        except:
            pass

注意:我不得不对这两个列表的结构做一些假设,因为正如评论员所指出的,您的示例中似乎有一些错误。如果我的假设不正确,请修复您的代码并让我知道

什么是“保留”
?它不能是python
列表,因为它缺少逗号。它是一个字符串吗?你能编辑你的问题并把你的例子的预期输出放在那里吗?首先,我认为你对列表和元组感到困惑。其次,我不能假设您的keep元素(如示例中所示)是什么??。问题是,keep是一个包含元组的列表,在示例中,我可以假设它的列表缺少逗号
keep
是一个Python列表,格式很奇怪,但我刚刚修复了它并添加了一个预期输出的示例。为什么
keep
由四项列表组成?这些是坐标吗?什么是保持?它不能是python
列表,因为它缺少逗号。它是一个字符串吗?你能编辑你的问题并把你的例子的预期输出放在那里吗?首先,我认为你对列表和元组感到困惑。其次,我不能假设您的keep元素(如示例中所示)是什么??。问题是,keep是一个包含元组的列表,在示例中,我可以假设它的列表缺少逗号
keep
是一个Python列表,格式很奇怪,但我刚刚修复了它并添加了一个预期输出的示例。为什么
keep
由四项列表组成?这些是坐标吗?我的
保留
列表的格式不正确,但现在已修复!它与您的示例略有不同我的
保留
列表的格式不正确,但现在已修复!这和你的例子略有不同