如何从包含许多已经排序的列表的列表中获取排序列表?

时间:2016-12-07 07:25:32

标签: python algorithm

例如,我有一个包含许多元素的列表

x = [[1, 2, 3], [3, 4, 5],[2, 3, 4], [4, 7, 8], ...]

每个元素已经排序。

如何从y的元素中获取名为x的列表并对其进行排序?

5 个答案:

答案 0 :(得分:4)

如果我正确理解您的问题,您应该查看heapq.merge

>>> import heapq
>>> lists = x = [[1, 2, 3], [3, 4, 5], [2, 3, 4], [4, 7, 8]]
>>> list(heapq.merge(*lists))
[1, 2, 2, 3, 3, 3, 4, 4, 4, 5, 7, 8]

答案 1 :(得分:0)

如果您只想对使用sorted进行排序,请尝试使用

x = [[1, 2, 3], [3, 4, 5],[2, 3, 4], [4, 7, 8]]
y = sorted(x)
print y

如果您想以排序方式获取所有元素,请尝试使用

x = [[1, 2, 3], [3, 4, 5],[2, 3, 4], [4, 7, 8]]
y = sorted([item for sublist in x for item in sublist])
print y

答案 2 :(得分:0)

你需要一个“合并”操作:从两个列表开始并继续使用较小的元素;当一个列表完成时,复制剩下的最终元素......

def merge(A, B):
    result = []
    ia = ib = 0
    while ia < len(A) and ib < len(B):
        if a[ia] < b[ib]:
            result.append(A[ia])
            ia += 1
        else:
            result.append(B[ib])
            ib += 1
    # copy "tail"
    while ia < len(A):
        result.append(A[ia])
        ia += 1
    while ib < len(B):
        result.append(B[ib])
        ib += 1
    return result

如果你有一组N个列表,只需将它们成对合并,你最终会得到一半。重复,直到你只得到一个清单。

答案 3 :(得分:0)

我将给你一些指示。

首先,定义一个函数merge(x, y),它获取两个排序列表并返回一个组合排序列表。

然后,在情侣

上运行合并
[merge(lst[i], lst[i+1] ) for i in range(0,len(lst),2) ] 

只要列表包含两个以上的元素,并且如果元素的数量是奇数,则应该重复此过程,将[]附加到

答案 4 :(得分:0)

方法1:

import heapq
x = [[1, 2, 3], [3, 4, 5],[2, 3, 4], [4, 7, 8]]
y = list(heapq.merge(*x))

方法2:

import itertools
y = sorted(itertools.chain(*x))