【问题标题】:How to create an ordered list from two other ordered lists [duplicate]如何从其他两个有序列表创建有序列表[重复]
【发布时间】:2022-01-19 19:37:53
【问题描述】:

我有两个没有重复的有序列表。我需要以最有效的方式创建第三个,但我被卡住了。 我可以这样做:

list1.extend(list2)
list1.sort(key=lambda x: x.id)

但考虑到两个列表都已排序,我认为这根本不是有效的。您对如何有效地做到这一点有什么建议吗?

例子:

list1 = [[40, 1980], [50, 1970], [70, 1980], [90, 1975]]
list2 = [[60, 1980],[65,1985]]


list3 = [[40, 1980],[50, 1970],[60, 1980],[65, 1985],[70, 1980],[90, 1975]]

PS: 唯一重要的是第一个变量是'id'

【问题讨论】:

  • 它实际上非常有效,并且可能是最干净的方法之一。
  • Python 使用Timsort 排序算法,该算法针对已排序和接近排序的输入进行了优化。它将一次性检测并合并两个排序的运行。
  • 除此之外,除非您在两个列表中都有很多时间 new 数据,并且必须重复很多次(例如,在处理网络消息时),否则无论如何,与您的整体计划相比,时间和资源可以忽略不计。但是这个算法可能很有趣。

标签: python list


【解决方案1】:

Python 在标准库中有一个名为heapq 的模块。它处理排序的优先级队列和最小/最大堆。

heapq.merge 允许您有效地合并多个排序的输入:

>>> import operator, heapq
>>> list1 = [[40, 1980], [50, 1970], [70, 1980], [90, 1975]]
>>> list2 = [[60, 1980],[65,1985]]
>>> list(heapq.merge(list1, list2, key=operator.itemgetter(0))
[[40, 1980], [50, 1970], [60, 1980], [65, 1985], [70, 1980], [90, 1975]]

【讨论】:

  • 然而,heapq 将在现有列表的中间进行插入,这根本没有效率。即使一个人可以侥幸逃脱。排序合并列表,我会说取决于输入数据,如果尝试逐项添加,它可能比合并两个列表并立即排序慢几个数量级。
  • @Chris_Rands hehe 已经做到了,谢谢 :-)
  • 哦,heapq.merge 将一步完成 - 抱歉 - 如果尝试将第二个列表中的逐项添加到第一个有序列表中,我上面的评论将适用。
  • @jsbueno heapq 尽可能高效地处理它。它只是返回所有迭代器中最小的一个并推进该迭代器。
【解决方案2】:

我已经尝试过并且工作过:

list1 = [[40, 1980], [50, 1970], [70, 1980], [90, 1975]]
list2 = [[60, 1980],[65,1985]]

list3=sorted(list1 + list2)

print(list3)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 2021-09-17
    • 2013-04-04
    • 1970-01-01
    • 2020-02-27
    相关资源
    最近更新 更多