根据另一个中的更改在python中重新排序列表

时间:2014-05-15 09:54:15

标签: python

我有两个相同大小的A和B列表。第一个列表由元组组成。我使用lambda函数对第一个列表A重新排序(因此我根据元组的第一个元素进行排序)。有没有办法根据相同的变化重新排序第二个列表?也就是说,如果列表A的第三个元素移动到第7位,那么列表B中的第三个元素也是如此。

3 个答案:

答案 0 :(得分:3)

a = [(1,'a'), (3,'b'), (2,'c')]
b = [4,6,5]

sort_function = lambda x: x[0][0]
sort_target = list(zip(a,b))
sort_target.sort(key = sort_function)

resorted_a, resorted_b = zip(*sort_target)

print (resorted_a) # prints ((1, 'a'), (2, 'c'), (3, 'b'))
print (resorted_b) # prints (4, 5, 6)

您必须稍微修改当前的排序lambda函数。简而言之,它应该将它的参数视为具有两个项目的元组:第一个列表中的项目和第二个列表中的项目。因此,为了保持排序顺序,首先应该从元组中提取第一个元素,而不是应用当前的排序lambda。

resorted_aresorted_b作为元组出现,但我希望这不是问题(否则明确将它们转换为列表,例如list_a = list(resorted_a)

有关详细信息,请参阅zip上的python文档。请注意它在官方文档中说明:

  

zip()与*运算符一起用于解压缩列表:

答案 1 :(得分:1)

您的代码现在看起来可能是这样的:

A.sort(key=lambda x: x[0])

遵循@ J0HN的建议:

A,B = zip(*sorted(zip(x,y),key=lambda x:x[0][0]))

将根据A中的图案的第一个元素对两个列表进行排序。

答案 2 :(得分:1)

按照zip,sort,unpack的想法:

lstA = ["a", "b", "z", "d"]
lstB = ["1a", "2b", "3z", "4d"]
print "lstA", lstA
print "lstB", lstB

# willing to have lstA sorted alphabetically and order of items in lstB follow the changes

sumlst = zip(lstA, lstB)
sumlst.sort(key=lambda itm: itm[0])

print "sumlst", sumlst

#unpack it to two separate lists

lstA = [a for a, b in sumlst]
lstB = [b for a, b in sumlst]

print "lstA", lstA
print "lstB", lstB

带输出:

lstA ['a', 'b', 'z', 'd']
lstB ['1a', '2b', '3z', '4d']
sumlst [('a', '1a'), ('b', '2b'), ('d', '4d'), ('z', '3z')]
lstA ['a', 'b', 'd', 'z']
lstB ['1a', '2b', '4d', '3z']