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

时间:2013-07-16 07:20:37

标签: python binary-search

我的问题接受一个(飞机列表)结构,其中一个飞机是一个列表[airplane_code,date,price]:

  • airplane_code是飞机名称
  • 日期为1-365(包括每个平面的所有日期可能不唯一)
  • price是int [> = 0],其中所有价格对于每个平面都是唯一的

该功能还会产生(平面列表)。我需要根据我的函数首先接受的另外两个变量(start_date和end_date)然后按价格(按升序)过滤此列表。但是,我只能使用二进制搜索概念来排序价格

def binary_search(lst, target):
    beginning = ...
    end = ...
    while ...:
        middle = ...
        if lst[middle] < target:
            ...
            ##update beginning and end
        else:
            ...
            ##update beginning and end

我无法弄清楚二进制搜索如何允许我对列表进行排序,并希望得到任何帮助。这是我到目前为止所做的事情(过滤给定的日期变量):

def determine(planes, start_date, end_date):
    correct_planes = []
    plane_price = []
    final_selection = []
    for plane in planes:
        if plane[1] >= start_date and plane[1] <= end_date:
            correct_planes.append(plane)
            plane_price.append(plane[2])

该功能如何运作的一个例子:

  

plane_list = [['A11',215,300],['A22',260,750],['A33',230,600],['A44',300,400]]

     

确定(plane_list,200,260)=&gt; [['A11',215,300],['A33',260,600],['A22',260,750]]

2 个答案:

答案 0 :(得分:0)

复杂的排序功能会简单得多,但您也可以使用二进制排序。使用lambdas可以最好地实现这一点。

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

1)Complex sort with multiple parameters?

2)Advanced sorting criteria for a list of nested tuples

编辑:根据hivert的评论,您也可以使用itemgetter进行排序。实施细节如下:http://wiki.python.org/moin/HowTo/Sorting/#Sort_Stability_and_Complex_Sorts

选择更适合您的方法。

答案 1 :(得分:0)

这可以使用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]]