Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python排序列表和关联列表_Python_List_Lambda_Matplotlib - Fatal编程技术网

Python排序列表和关联列表

Python排序列表和关联列表,python,list,lambda,matplotlib,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函

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

我有一个图表的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函数和sortedkey=但我不明白这两个函数都不起作用,而是因为我不了解它们,而不是因为它们不起作用

非常感谢


编辑:非常感谢你们所有人,我希望我能选择你们所有人作为正确的答案,但不幸的是我可以。您的解释非常有帮助,我现在对python有了更多的了解。谢谢

查看zip和排序函数

zipy,x将返回元组列表[y1,x1,y2,x2,…]

sortedzipy,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]

祝你好运

查看zip和排序函数

zipy,x将返回元组列表[y1,x1,y2,x2,…]

sortedzipy,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]

祝你好运

sortedkey=功能的工作原理如下

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函数返回元组中的第二项,即yVar,该yVar已与其对应的xVar压缩。sortedkey=函数的工作原理如下

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函数返回元组中的第二项,即yVar,它已与其对应的xVar压缩。在这里,您可以使用该函数很好地完成此操作。首先,我们将值压缩成对

可以使用对值进行排序。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=listyVars,listxVars

如果希望将其扩展到两个以上的列表,只需向zip添加更多参数,它将返回更多参数

请注意,这将按第一个值排序,然后按碰撞的第二个值排序。这意味着,如果有重复的值,则顺序可能与预期的不同。在这种情况下,您可以绝对指定密钥:

yVars, xVars = zip(*sorted(zip(yVars, xVars), key=lambda item: item[0]))
在这里,您可以使用该函数很好地完成此操作。首先,我们将值压缩成对

可以使用对值进行排序。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=listyVars,listxVars

如果希望将其扩展到两个以上的列表,只需向zip添加更多参数,它将返回更多参数

请注意,这将按第一个值排序,然后按碰撞的第二个值排序。这意味着,如果有重复的值,则顺序可能与预期的不同。在这种情况下,您可以绝对指定密钥:

yVars, xVars = zip(*sorted(zip(yVars, xVars), key=lambda item: item[0]))

实际上,你不需要使用zip。只需使用YVAR作为排序键对XVAR进行排序,然后就可以使用新的XVAR以正确的顺序重建YVAR:

>>> 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]
此外,如果您只想获得最大的y值及其关联的x值,则可以使用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])

实际上,你不需要使用zip。只需使用yVars作为排序键对xVars进行排序,然后是y 您可以使用新的XVAR以正确的顺序重建YVAR:

>>> 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]
此外,如果您只想获得最大的y值及其关联的x值,则可以使用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])


你有充分的理由使用2个列表而不是元组列表吗?@Wooble如果我没记错元组不能正确更改其内容?目前我不需要修改列表的值,但将来可能需要修改。如果需要将点更改为其他点,可以使用其他元组替换整个元组。或者使用一个由两个元素组成的列表。您是否有充分的理由使用两个列表而不是元组列表?@Wooble如果我回忆正确,元组无法正确更改其内容?目前我不需要修改列表的值,但将来可能需要修改。如果需要将点更改为其他点,可以使用其他元组替换整个元组。或者使用一个由两个元素组成的列表。我认为最好不要在labda中使用x作为变量,因为OP可能很容易将其与XVAR混淆…这个答案不是最优的-您可以很容易地去掉关键参数,并且不必使用列表理解。请看我的答案。我认为最好不要在labda中使用x作为变量,因为OP可能会很容易将其与XVAR混淆…这个答案不是最优的-您可以很容易地去掉关键参数,并且不需要使用列表理解。看看我的答案。@DSM,我不明白为什么应该这样。你能解释一下你怎么认为它会失败吗?e、 g.尝试[9,7,1,3,7,5]求y和x=range1,7给出输出x的[3,4,6,2,5,1],输出y被排序。啊,对不起-大脑崩溃,我说的完全是愚蠢的。[我的测试用例崩溃了,但我错了原因。]我应该说的是,您的解决方案假设xVars的范围为1,lenyVars+1,而标准解决方案则不是。例如,[1,2,3,4,5,7],[9,7,1,3,5,8]碰撞。考虑到可能的用例,不依赖于x的特殊特性的解决方案可能更好。@DSM,我不明白为什么它应该这样做。你能解释一下你怎么认为它会失败吗?e、 g.尝试[9,7,1,3,7,5]求y和x=range1,7给出输出x的[3,4,6,2,5,1],输出y被排序。啊,对不起-大脑崩溃,我说的完全是愚蠢的。[我的测试用例崩溃了,但我错了原因。]我应该说的是,您的解决方案假设xVars的范围为1,lenyVars+1,而标准解决方案则不是。例如,[1,2,3,4,5,7],[9,7,1,3,5,8]碰撞。考虑到可能的使用情况,不依赖于x的特殊功能的sol'n可能更好。酷-我不知道slpat可以反转拉链@tomstratton这是一个很酷的小功能,在这种情况下非常有用。酷-我不知道slpat可以反转拉链@tomstratton这是一个很酷的小功能,在这种情况下非常有用。