python排序两个列表

fmo*_*lia 24 python sorting list

我试图将两个列表排在一起:

list1 = [1, 2, 5, 4, 4, 3, 6]
list2 = [3, 2, 1, 2, 1, 7, 8]

list1, list2 = (list(x) for x in zip(*sorted(zip(list1, list2))))
Run Code Online (Sandbox Code Playgroud)

无论如何,这样做可以让我输出

list1 = [1, 2, 3, 4, 4, 5, 6]
list2 = [3, 2, 7, 1, 2, 1, 8]
Run Code Online (Sandbox Code Playgroud)

虽然我想在第一个清单中保留4号等号的初始订单:我想要的是

list1 = [1, 2, 3, 4, 4, 5, 6]
list2 = [3, 2, 7, 2, 1, 1, 8]
Run Code Online (Sandbox Code Playgroud)

我需要做什么?我不想使用循环进行冒泡排序.任何帮助赞赏.

int*_*jay 32

使用key您的排序参数仅比较该对的第一个元素.由于Python的排序是稳定的,这保证了当第一个元素相等时,第二个元素的顺序将保持不变.

>>> from operator import itemgetter
>>> [list(x) for x in zip(*sorted(zip(list1, list2), key=itemgetter(0)))]
[[1, 2, 3, 4, 4, 5, 6], [3, 2, 7, 2, 1, 1, 8]]
Run Code Online (Sandbox Code Playgroud)

这相当于:

>>> [list(x) for x in zip(*sorted(zip(list1, list2), key=lambda pair: pair[0]))]
[[1, 2, 3, 4, 4, 5, 6], [3, 2, 7, 2, 1, 1, 8]]
Run Code Online (Sandbox Code Playgroud)


Mar*_*ery 6

这里的诀窍是,当Python进行元组比较时,它会按从左到右的顺序对元素进行比较(例如(4, 1) < (4, 2),这就是在特定情况下没有获得所需顺序的原因).这意味着你需要向函数传递一个key参数sorted,告诉它只使用对元组的第一个元素作为它的排序表达式,而不是整个元组.

这保证保留您想要的顺序,因为:

保证种类稳定.这意味着当多个记录具有相同的密钥时,将保留其原始顺序.

(资源)

>>> list1 = [1, 2, 5, 4, 4, 3, 6]
>>> list2 = [3, 2, 1, 2, 1, 7, 8]
>>> 
>>> list1, list2 = (list(x) for x in zip(*sorted(zip(list1, list2), key=lambda pair: pair[0])))
>>> 
>>> print list1
[1, 2, 3, 4, 4, 5, 6]
>>> print list2
[3, 2, 7, 2, 1, 1, 8]
Run Code Online (Sandbox Code Playgroud)