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