在python中排序混合列表?

时间:2015-12-17 09:05:30

标签: python list sorting

我想要排序列表; 我的意见是

list1  = [[10,[1,4,5]],[40,[1,5,6]],[30,[2,4,5]],[50,[3,5,6]],[60,[2,5,6]],[20,[3,4,5]]]

我的例外输出是

list1  = [[10,[1,4,5]],[30,[2,4,5]],[20,[3,4,5]],[40,[1,5,6]],[60,[2,5,6]],[50,[3,5,6]]]

请给我一些东西。提前谢谢。

6 个答案:

答案 0 :(得分:2)

<强>更新

这是产生我想要你想要的输出的东西:

list1  = [[10,[1,4,5]],[40,[1,5,6]],[30,[2,4,5]],[50,[3,5,6]],[60,[2,5,6]],[20,[3,4,5]]]
print(sorted(list1, key=lambda x: (x[1][1:], x[1][0])))

<强>输出

[[10, [1, 4, 5]], [30, [2, 4, 5]], [20, [3, 4, 5]], [40, [1, 5, 6]], [60, [2, 5, 6]], [50, [3, 5, 6]]]

这会将第二个项目排序到内部列表的末尾,然后排在内部列表的第一个项目上。您会注意到,您对[20, [3, 4, 5]][30, [2, 4, 5]]项的输入会将预期输出更改为[20,[2,4,5]][30,[3,4,5]]。你的问题确实有拼写错误。

原始回答

看起来您想要对每个列表项的内部列表进行排序。我说“看起来”,因为它不会产生所需的输出,但它看起来很接近。

list1  = [[10,[1,4,5]],[40,[1,5,6]],[30,[2,4,5]],[50,[3,5,6]],[60,[2,5,6]],[20,[3,4,5]]]
list1 = sorted(list1, key=lambda x: x[1])
print(list1)

<强>输出

[[10, [1, 4, 5]], [40, [1, 5, 6]], [30, [2, 4, 5]], [60, [2, 5, 6]], [20, [3, 4, 5]], [50, [3, 5, 6]]]

答案 1 :(得分:2)

>>> sorted(list1, key=lambda x: (x[1][1:], x[1][0]))
[[10, [1, 4, 5]], [30, [2, 4, 5]], [20, [3, 4, 5]], [40, [1, 5, 6]], [60, [2, 5, 6]], [50, [3, 5, 6]]]
>>> 

因此,如果我没错,您就会尝试获取[1, 4, 5][2, 4, 5][3, 4, 5],然后[1, 5, 6],{{1} },[2, 5, 6]

然后使用strategy pattern对您的列表进行排序,[3, 5, 6]为您提供(x[1][1:], x[1][0])4, 5, 1之类的内容。然后sorted()函数将根据它们对列表进行排序。

请注意,4, 5, 2会创建另一个列表,但它不会更改当前列表。如果您想要更改它,您需要使用:

sorted()

但是,这是使用sorted()的另一种方式:

list1 = sorted(list1, key=lambda x: (x[1][1:], x[1][0]))

答案 2 :(得分:1)

您应该使用自定义函数进行排序。如果我理解你尝试做什么,你需要:

def cmp_items(a, b):
    if a[0] > b[0]:
        return 1
    elif a[0] == b[0]:
        return 0
    else:
        return -1           

myList.sort(cmp_items)

答案 3 :(得分:1)

您可以将键元素传递给已排序的函数:

>>> sorted(list1, key=lambda x:x[0])
[[10, [1, 4, 5]], [20, [3, 4, 5]], [30, [2, 4, 5]], [40, [1, 5, 6]], [50, [3, 5, 6]], [60, [2, 5, 6]]]

答案 4 :(得分:1)

怎么样:

>>> sorted(list1)
[[10, [1, 4, 5]], [20, [3, 4, 5]], [30, [2, 4, 5]], [40, [1, 5, 6]], [50, [3, 5, 6]], [60, [2, 5, 6]]]

如果您希望输出为:[[1, 4, 5], [2, 4, 5], [3, 4, 5], [1, 5, 6], [3, 5, 6], [2, 5, 6]],如下面的评论中所示,您可以使用sortedlist comprehension

>>> list2 =sorted([i[1] for i in list1], key=lambda x: x[2])
>>> list2
[[1, 4, 5], [2, 4, 5], [3, 4, 5], [1, 5, 6], [3, 5, 6], [2, 5, 6]]

答案 5 :(得分:1)

这种方法很有效,它不会按照你想要的方式改变内部列表。

list1 = sorted(list1)
list1[-1], list1[-2] = list1[-2], list1[-1]
print (list1)