根据另一个列表的排序将转换应用于列表

时间:2015-01-26 14:09:15

标签: python sorting

我有两个清单;

A = ['red', 'green', 'blue', 'white', 'black']
B = ['22', '34', '7', '3', '850']

我希望将列表B从最大值排序到最小值,然后根据应用于列表B的转换对列表A进行排序。这是;

A = ['black', 'green', 'red', 'blue', 'white']
B = ['850', '34', '22', '7', '3']

5 个答案:

答案 0 :(得分:5)

最简单的方法是将它们压缩在一起,按第二个组件对它们进行排序,然后解压缩它们:

ab = zip(A, B)
ab.sort(key=lambda values: int(values[1]), reverse=True)
A, B = zip(*ab)

答案 1 :(得分:2)

zip他们创建一系列元组,然后使用列表推导从排序顺序中的每个元组中提取第一个值。

A key argument can be passed to sorted,允许您根据功能进行排序。在下面的示例中,我们使用lambda function进行排序,它将组合元组中的第二个值转换为整数。

请注意,排序字符串和排序整数之间存在差异,因此您必须使用B转换int的值,如果由于某种原因您不想这样做,那么您可以删除lambda函数中的int调用。

A = ['red', 'green', 'blue', 'white', 'black']
B = ['22', '34', '7', '3', '850']

C = zip(A, B)

D = [i for i, _ in sorted(C, key=lambda x:int(x[1]), reverse=True)]

print(D)
# ['black', 'green', 'red', 'blue', 'white']

答案 2 :(得分:1)

除了内置函数zip& {@ 1}} @DanielRoseman回答说,您可以使用sort模块进行排序:

numpy
当您要排序的列表为大尺寸时,

In [116]: import numpy as np ...: A = ['red', 'green', 'blue', 'white', 'black'] ...: B = ['22', '34', '7', '3', '850'] ...: A = np.asarray(A) ...: B = np.asarray(B) ...: iB = np.asarray(map(int, B)) ...: idx = iB.argsort()[::-1] #get indices in reverse order ...: sa = A[idx] ...: sb = B[idx] In [117]: print sa, sb ['black' 'green' 'red' 'blue' 'white'] ['850' '34' '22' '7' '3'] 会更有效。

基准:

numpy

答案 3 :(得分:0)

sorted_by_second_list = [x[0] for x in sorted(zip(A,B),key=lambda tup: int(tup[1]))]

zip将创建一个元组列表,与sort函数中的lambda一起使用

答案 4 :(得分:-1)

a=['red','green','blue','white','black']
b=[22,34,7,3,850]
c=zip(a,b)
print c
[('red', 22), ('green', 34), ('blue', 7), ('white', 3), ('black', 850)]
from operator import itemgetter
sorted(c, key=itemgetter(1), reverse=True)
[('black', 850), ('green', 34), ('red', 22), ('blue', 7), ('white', 3)]