Python排序列表及关联列表

1 投票
5 回答
1781 浏览
提问于 2025-04-17 12:51

我有一个比较简单的问题,虽然找到了几个答案,但我还是搞不明白。

我有一组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

我这样做的目的是想要绘制最大y值和对应的x值。

我遇到了itemgetter()函数和sorted(key=)这个东西,但我都不太明白(其实它们是可以用的,只是我不太理解而已)。

非常感谢大家的帮助!

补充:非常感谢你们,我希望能把所有人都选为正确答案,但可惜我只能选一个。你们的解释对我很有帮助,我现在对python了解多了不少。谢谢! :)

5 个回答

0

看看zip和sorted这两个函数吧...

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]

这里有几点需要注意——为了让排序更简单,我把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]

祝你好运!

1

在这里,你可以使用 zip() 函数来很好地完成这个任务。首先,我们把值配对在一起。

接着,你可以使用 sorted() 来对这些值进行排序。排序的时候,它会根据元组中的第一个值来排序,所以我们把想要排序的项目放在最前面。

现在,我们使用 zip 和一个叫做 splat 的操作符来反转之前的配对过程,这样就得到了一个简洁的一行代码:

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

撰写回答