根据另一个列表的排序方式对列表进行排序。 Python 3

时间:2018-06-12 13:24:07

标签: python list sorting

我一直在努力根据Python 3中的先前排序列表对列表进行排序一段时间,虽然我会向你们寻求帮助。

好的,所以我有一个清单:

list = ['A103', 'A101', 'C101', 'B101'] 

此列表按字母顺序排列,然后使用以下代码进行数字排序:

convert = lambda text: int(text) if text.isdigit() else text
alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key)]
list_sorted = sorted(list, key=alphanum_key)

新列表list_sorted如下所示:['A101', 'A103', 'B101', 'C101']

现在到了棘手的部分,我有另一个列表,其值与“list”中的值相对应,需要以相同的方式排序。

示例:

list = ['A103', 'A101', 'C101', 'B101'] 

rad = ['£', '$', '€', '@']


list_sorted =['A101', 'A103', 'B101', 'C101']

rad = ['$', '£', '@', '€'].

非常感谢所有帮助,谢谢!

2 个答案:

答案 0 :(得分:2)

不要尝试排序两次。相反,在排序之前将两个列表压缩在一起,并仅对第一个项目进行排序。

import re

list = ['A103', 'A101', 'C101', 'B101']
rad = ['£', '$', '€', '@']

convert = lambda text: int(text) if text.isdigit() else text
alphanum_key = lambda key: [convert(c) for c in re.split('([0-9]+)', key[0])]
#                                           only consider first item ----^

list_sorted = sorted(zip(list, rad), key=alphanum_key)
#   zip both lists ---^

print(list_sorted) # [('A101', '$'), ('A103', '£'), ('B101', '@'), ('C101', '€')]

这可以很容易地推广到两个以上的解包列表。

list = ['A103', 'A101', 'B101']
rad = ['£', '$', '@']
more = [1, 2, 3]

lists = list, rad, more

...

list_sorted = sorted(zip(*lists), key=alphanum_key)

print(list_sorted) # [('A101', '$', 2), ('A103', '£', 1), ('B101', '@', 3)]

答案 1 :(得分:0)

你可以使用这个

list1 = ['A103', 'A101', 'C101', 'B101'] 
list2 = ['£', '$', '€', '@']
list3 = [4,3,2,1]

list_sorted1, list_sorted2, list_sorted3 = zip(*sorted(zip(list1, list2, list3))) # sort all list according to list1

希望它会有所帮助。