Python3:两个 list 一一对应,将一个 list 排序,要求另一个 list 随之排序
一、需求
现有两个 list:A, B,其中A中保存日期,B中保存该日期下的产量,要求按照产量排序,并使日期列表随之排序。
二、解法
1. 将A,B两个 list 变成 list of tuple,使用 zip() 函数
zipped = zip(A,B) # print(list(zipped)) # python2中可以直接 print(zipped), python3 中改为 print(list(zipped))
假设A = [1,2,3], B = [6,5,4]
此时 zipped = [(1,6), (2,5), (3,4)]
2. 排序
sort_zipped = sorted(zipped,key=lambda x:(x[1],x[0])) # 先按 x[1] 进行排序,若 x[1] 相同,再按照 x[0] 排序
此时 sort_zipped = [(3,4), [2,5], [1,6]]
上述代码完成按照产量排序。
3. 拆分
result = zip(*sort_zipped) # 将 sort_zipped 拆分成两个元组,为 [(3,2,1),(4,5,6)] x_axis, y_axis = [list(x) for x in result] # 将拆分后的两个元组分别变成 list 列表,为 [3,2,1],[4,5,6]
以上,问题解决。
————————————————————————————————————————————————————————
补充个知识点。
zip 是一个生成器 的函数,它的结果是一个迭代器,该结果只能调用一次,举例如下图:
上图说明 b 调用一次之后,再调用的 c 则为空。如果想要复用这个结果,需要保存到 list 里,即:
temp = list(zipped) # 接本文开头的例子,如果直接 print(list(zipped)),则之后 zipped为空,因为已经用完一次迭代器了
关于迭代器和生成器,分享个链接,简单易懂:
http://www.runoob.com/python3/python3-iterator-generator.html