【问题标题】:Using Binary Search to Sort a List in Python在 Python 中使用二分搜索对列表进行排序
【发布时间】:2013-07-16 07:20:37
【问题描述】:

我的问题接受一个 (listof plane) 结构,其中飞机是一个列表 [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]]

determine(plane_list, 200, 260) => [['A11', 215, 300], ['A33', 260, 600], ['A22', 260, 750]]

【问题讨论】:

  • 我不明白你对使用二分搜索的限制......你似乎知道如何比较平面,所以任何比较排序都应该有效。你可能应该看看wiki.python.org/moin/HowTo/Sorting
  • 我正在学习的课程希望我们获得更多的二分搜索经验(但教给我们的经验很少)。因此,我仅限于二进制搜索。
  • 二进制搜索不是排序算法。这是一种在已排序的集合中搜索项目的方法。
  • FWIW, plane 应该是一个元组,而不是一个列表。元组用于存储结构,元组中每个字段的位置表示其含义。 (例如,plane[0] 始终是 str 平面名称。)列表用于存储可互换项目的有序集合(例如,plane 元组的列表。)

标签: python binary-search


【解决方案1】:

复杂的排序函数会简单得多,但您也可以使用二进制排序。这可以最好地使用 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

选择适合你的方法。

【讨论】:

  • 正如我上面提到的,我正在学习的课程希望我们获得更多的二进制搜索经验,因此我仅限于二进制搜索。我也一定会探索这种方法。
  • 抱歉,没有看到评论。
  • 我以为我只能使用二分查找,意思是你只知道如何使用二分查找。
【解决方案2】:

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

【讨论】:

  • 正如我上面提到的,我正在学习的课程希望我们获得更多的二进制搜索经验,因此我仅限于二进制搜索。不过还是谢谢你的回答。
猜你喜欢
  • 2013-03-06
  • 2010-12-25
  • 2017-03-26
  • 1970-01-01
  • 2015-05-16
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 2020-07-19
相关资源
最近更新 更多