Python排序列表和关联列表

时间:2012-02-11 18:24:57

标签: python list lambda matplotlib

我有一个相当简单的问题,我已经找到了这个问题的几个答案,但我根本无法理解它。

我有一个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的知识。谢谢! :)

5 个答案:

答案 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])