我有一个相当简单的问题,我已经找到了这个问题的几个答案,但我根本无法理解它。
我有一个x值列表(用于绘图)和一个同样长的y值列表。我想对y值列表进行排序并相应地更新我的x列表。 假设我有这些列表
xVars = [1,2,3,4,5]
yVars = [9,7,1,3,5]
排序后,这是我想要的结果:
xVars = [3,4,5,2,1]
yVars = [1,3,5,7,9] #this is now sorted
我这样做的意思是我想用相关的x值绘制最大y值。
我遇到了itemgetter()函数和sorted(key =),但我也不理解(也就是说,它们不起作用,但是由于我不理解它们而不是因为它们不起作用)
非常感谢提前!
编辑:非常感谢大家,我希望我能选择你们所有人作为正确的答案,但遗憾的是我可以。你的解释非常有用,我现在已经学到了很多关于python的知识。谢谢! :)
答案 0 :(得分:4)
>>> tmp = sorted(zip(xVars, yVars),key=lambda x: x[1])
>>> xVars = [x[0] for x in tmp]
>>> yVars = [x[1] for x in tmp]
>>> xVars
[3, 4, 5, 2, 1]
>>> yVars
[1, 3, 5, 7, 9]
答案 1 :(得分:1)
在这里,您可以使用zip()
功能很好地完成此操作。首先,我们将值压缩成对。
您可以使用sorted()
对值进行排序。 Sorted将使用元组的第一个值进行排序,因此我们首先放置我们希望排序的项目。
现在我们使用带有splat操作符的zip来反转压缩程序,从而产生了这个漂亮的单行程序:
yVars, xVars = zip(*sorted(zip(yVars, xVars)))
产生想要的输出:
>>> xVars = [1,2,3,4,5]
>>> yVars = [9,7,1,3,5]
>>> yVars, xVars = zip(*sorted(zip(yVars, xVars)))
>>> xVars
(3, 4, 5, 2, 1)
>>> yVars
(1, 3, 5, 7, 9)
请注意,这些是元组,因此如果您再次需要列表,请稍后执行简单的yVars, xVars = list(yVars), list(xVars)
。
如果您希望将其扩展为两个以上的列表,只需向zip添加更多参数,它将返回更多。
请注意,这将按第一个值排序,然后按第二个值排序。这意味着如果您有重复的值,订单可能会与您的预期不同。在这种情况下,您可以绝对指定密钥:
yVars, xVars = zip(*sorted(zip(yVars, xVars), key=lambda item: item[0]))
答案 2 :(得分:0)
查看zip和排序函数......
zip(y,x)
将返回元组列表[(y1,x1),(y2,x2),...]
sorted(zip(y,x))
将对此列表进行排序 - 默认情况下,对元组中的第一个值(y)进行排序
然后,您可以使用列表推导将其重新转换为单独的列表。
>>> xVars = [1,2,3,4,5]
>>> yVars = [9,7,1,3,5]
>>> sorted_list= sorted(zip(yVars,xVars))
>>> sorted_x = [ b for a,b in sorted_list ]
>>> sorted_y = [ a for a,b in sorted_list ]
>>> print(sorted_x)
[3, 4, 5, 2, 1]
>>> print(sorted_y)
[1, 3, 5, 7, 9]
这里有几点 - 为了使sort()更容易,我改变了x和y的顺序,以便它自动对y值进行排序。
如果你还不熟悉列表推导,这里是等效的语法......
squares = [x**2 for x in range(10)]
与......相同。
>>> squares = []
>>> for x in range(10):
... squares.append(x**2)
...
>>> squares
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
祝你好运!
答案 3 :(得分:0)
sorted(key =)函数的工作原理如下
xVars = [1,2,3,4,5]
yVars = [9,7,1,3,5]
xyZipped = zip(xVars, yVars)
sorted(xyZipped, key=lambda xyZipped: xyZipped[1])
print(xyZipped)
键是一个函数(在本例中是一个lambda函数),它返回一个参数以供操作的排序。 lambda函数返回元组中的第二个项目,即使用相应的xVar拉链的yVar
答案 4 :(得分:0)
您实际上不需要使用zip
。只需使用xVars
作为排序键对yVars
进行排序,然后您就可以使用新的xVars
按正确的顺序重建yVars
:
>>> xVars = [1,2,3,4,5]
>>> yVars = [9,7,1,3,5]
>>> xVars = sorted(xVars, key=lambda i: yVars[i-1])
>>> yVars = [ yVars[i-1] for i in xVars ]
>>> xVars
[3, 4, 5, 2, 1]
>>> yVars
[1, 3, 5, 7, 9]
此外,如果您只是想获得具有相关x值的最大y值,那么您可以使用heapq.nlargest
而不是对整个列表进行排序。如果您有长列表并且只想要几个大值,那么这可能会更有效:
>>> xVars = [1,2,3,4,5]
>>> yVars = [9,7,1,3,5]
>>> from heapq import nlargest
>>> x_largest = nlargest(3, xVars, key=lambda i: yVars[i-1])
>>> y_largest = [ yVars[i-1] for i in x_largest ]
>>> x_largest, y_largest
([1, 2, 5], [9, 7, 5])