为什么我的代码没有给出所需的输出 [duplicate]

Why my code is not giving the desired output [duplicate]

提问人:codersanchez 提问时间:10/20/2023 最后编辑:TheMastercodersanchez 更新时间:10/20/2023 访问量:64

问:

l = [(2, 1), (1, 2), (4, 4), (2, 3), (2, 5)]
a = []
l1 = l
n = len(l)
for i in range(n):
    a.append(l[i][1])
b = sorted(a)
for i in range(n):
    for j in range(n):
        if (l1[j][1] == b[i]):
            l[i] = l1[j]
            break;

print(l)

我编写了这个 python 代码来重新排列输入列表的元素,使 element(列表中的元组被视为元素)根据每个元组 1st 索引值的升序放置; 例如

input = [(2, 1), (1, 2), (4, 4), (2, 3), (2, 5)]

输出应为

l = [(2, 1), (1, 2), (2, 3), (4, 4), (2, 5)] 

(请参阅每个元组的第 2 个元素按升序排列 1、2、3、4、5) 我的代码有什么问题

python list 循环排序 for 循环

评论

0赞 TheMaster 10/20/2023
您是否登录以查看它是如何排序的?b
1赞 Weijun Zhou 10/20/2023
请注意,这可以在一行中实现:。a=sorted(l, key=lambda x:x[1])
0赞 codersanchez 10/20/2023
我知道这可以在一行中实现,但我想知道这段代码有什么问题,这段代码对我来说似乎是正确的,我也检查了列表 B,它已成功按升序排序
0赞 TheMaster 10/20/2023
@codersanchez 因为你不完全是用 .这两个变量都引用内存中的同一事物l1=l

答:

1赞 blhsing 10/20/2023 #1

使用以下分配:

l1 = l

l1成为引用与 相同的列表对象的名称,因此,当您在索引处修改时:lli

l[i] = l1[j]

您实际上也修改了 at 索引,因此当迭代到过去的值之一时,将不再具有原始元素的值。l1ijil1[j]

您可以通过创建一个新的列表对象来解决此问题,该对象的值是从以下位置复制的:l1l

l1 = l.copy()

评论

1赞 codersanchez 10/20/2023
兄弟,非常感谢你,它现在可以工作了
0赞 Weijun Zhou 10/20/2023
@codersanchez 您应该投赞成票并接受答案,而不是发表评论。
0赞 codersanchez 10/20/2023
我试过了,但似乎我不能投票,因为我没有足够的声誉
0赞 blhsing 10/20/2023
@codersanchez 您可以通过单击答案旁边的灰色复选标记来接受答案,无需信誉。
1赞 Mahboob Nur 10/20/2023 #2

您没有根据每个元组的第二个元素的升序正确排序原始列表 l。 我已经修改了您的代码,它可以工作。

l = [(2, 1), (1, 2), (4, 4), (2, 3), (2, 5)]
sorted_l = sorted(l, key=lambda x: x[1])
print(sorted_l)

Output