在Python中使用二进制搜索对列表排序

在Python中使用二进制搜索对列表排序,python,binary-search,Python,Binary Search,我的问题接受(飞机列表)结构,其中飞机是一个列表[飞机代码、日期、价格]: 飞机代码是飞机名称 日期为1-365,其中每个平面的所有日期可能不唯一 价格为int[>=0],其中每个平面的所有价格都是唯一的 该函数还生成(平面列表)。我需要首先根据函数接受的另外两个变量(开始日期和结束日期)过滤这个列表,然后根据价格(升序)过滤。但是,我仅限于使用二进制搜索概念对价格进行排序: def binary_search(lst, target): beginning = ... en

我的问题接受(飞机列表)结构,其中飞机是一个列表[飞机代码、日期、价格]:

  • 飞机代码是飞机名称
  • 日期为1-365,其中每个平面的所有日期可能不唯一
  • 价格为int[>=0],其中每个平面的所有价格都是唯一的
该函数还生成(平面列表)。我需要首先根据函数接受的另外两个变量(开始日期和结束日期)过滤这个列表,然后根据价格(升序)过滤。但是,我仅限于使用二进制搜索概念对价格进行排序

def binary_search(lst, target):
    beginning = ...
    end = ...
    while ...:
        middle = ...
        if lst[middle] < target:
            ...
            ##update beginning and end
        else:
            ...
            ##update beginning and end
def二进制搜索(lst,目标):
开始=。。。
结束=。。。
而
中间=。。。
如果lst[中间]<目标:
...
##更新开始和结束
其他:
...
##更新开始和结束
我不知道如何二进制搜索将允许我排序列表,并将感谢任何帮助。这就是我到目前为止所做的(过滤给定的日期变量):

def确定(平面、开始日期、结束日期):
正确的_平面=[]
飞机价格=[]
最终选择=[]
对于平面中的平面:
如果平面[1]>=开始日期和平面[1][[A11',215,300],[A33',260,600],[A22',260,750]]


复杂的排序函数会简单得多,但也可以使用二进制排序。这可以通过使用lambdas实现

有关实施细节,请参阅以下链接:

(一)

(二)

编辑:根据hivert的评论,您也可以使用itemgetter进行排序。实施详情如下:


选择对您更合适的方法。

这可以使用python排序算法干净地完成。由于编码和性能方面的原因,您只进行二进制搜索的限制似乎不太好,因为列表不会很大

>>> plane_list = [['A11', 215, 300], ['A22', 260, 750], ['A33', 230, 600], ['A44', 300, 400]]
>>> start_date,end_date = 200, 260
>>> new_list = [x for x in plane_list if start_date <= x[1] <= end_date]
>>> new_list
[['A11', 215, 300], ['A22', 260, 750], ['A33', 230, 600]]
>>> new_list = sorted(new_list,key= lambda x:x[1])
>>> new_list
[['A11', 215, 300], ['A33', 230, 600], ['A22', 260, 750]]
平面列表=['A11',215,300],'A22',260,750],'A33',230,600],'A44',300,400]] >>>开始日期,结束日期=200260 >>>新列表=[x代表平面中的x列表,如果开始日期>新列表 [A11',215,300],[A22',260,750],[A33',230,600]] >>>新建列表=已排序(新建列表,键=lambda x:x[1]) >>>新名单 [A11',215,300],[A33',230,600],[A22',260,750]]
我不理解您使用二进制搜索的限制条件……您似乎知道如何比较平面,因此任何形式的比较都应该有效。您可能应该看看我正在学习的课程,它希望我们获得更多的二进制搜索经验(但教给我们的很少)。因此,我仅限于二进制搜索。二进制搜索不是一种排序算法。它是一种在已排序的集合中搜索项目的方法。FWIW,
plane
应该是元组,而不是列表。元组用于存储结构,元组中每个字段的位置表示其含义。(例如,plane[0]列表用于存储可互换项的有序集合(例如
plane
元组的列表)正如我上面提到的,我正在学习的课程希望我们在二进制搜索方面获得更多经验,因此我被限制在二进制搜索方面。谢谢你的回答。正如我上面提到的,我正在学习的课程希望我们在二进制搜索方面获得更多经验,因此我被限制在二进制搜索方面。我肯定也会探索这种方法l、 抱歉,没有看到评论。我想我只能使用二进制搜索,这意味着你只知道如何使用二进制搜索。
>>> plane_list = [['A11', 215, 300], ['A22', 260, 750], ['A33', 230, 600], ['A44', 300, 400]]
>>> start_date,end_date = 200, 260
>>> new_list = [x for x in plane_list if start_date <= x[1] <= end_date]
>>> new_list
[['A11', 215, 300], ['A22', 260, 750], ['A33', 230, 600]]
>>> new_list = sorted(new_list,key= lambda x:x[1])
>>> new_list
[['A11', 215, 300], ['A33', 230, 600], ['A22', 260, 750]]