挑战:从包含 5 个元素的列表中找到可以从四个元素中获得的最小和最大和。方法如下:按降序和升序对列表进行排序,并将它们存储到两个不同的变量中。查找两个列表中前 4 个元素的总和。一笔金额最少,第二笔金额最多。代码 :arr = [2,1,3,4,5]arr.sort()asc = arrprint(asc[0],asc[1],asc[2],asc[3])arr.sort(reverse = True)des = arrprint(des[0],des[1],des[2],des[3])maxi = 0mini = 0for j in range(4) : mini = mini + asc[j] print(mini, asc[j]) maxi = maxi + des[j] print(maxi,des[j])print(mini, maxi)出于调试目的,这里引入了很少的打印语句。从代码中可以看出,bot 在进入 for 循环之前和进入循环之后都会打印排序后的版本。在输出中可以清楚地看到,应该按升序保存元素的列表是按降序排列的元素。输出 :11 12 13 14 - list in the ascending order15 14 13 12 - list in the descending order15 15 - round 015 1529 14 - round 129 1442 13 - round 242 1354 12 - round 354 1254 54 - final output为什么某个特定列表中的元素在进入 for 循环时会改变它们的顺序?
2 回答
慕斯709654
TA贡献1840条经验 获得超5个赞
当您正在执行asc = arr并且des = arr未创建新列表时。asc,des并且arr链接到一个列表对象,所以当你改变它们中的任何一个时,所有变量都将被更改,因为它是单个对象。
In [1]: a = [1, 2]
In [2]: b = a
In [3]: id(a), id(b)
Out[3]: (140601802913048, 140601802913048)
In [4]: b = a[:]
In [5]: id(a), id(b)
Out[5]: (140601802913048, 140601819243872)
如果你想要一份清单的副本,做
asc = arr[:]
des = arr[:]
ITMISS
TA贡献1871条经验 获得超8个赞
你需要做:
asc = arr.copy()
# or asc = arr[:]
否则,当arr反向排序时,asc也会发生变化。asc是一个指向数组的指针,当arr改变时,asc改变。更好的是,您创建 的副本arr,因此更改不会反映回来。
您编写的整个代码可以浓缩为这两行:
arr = [2,1,3,4,5]
print(sum(sorted(arr)[:4])) # 10
print(sum(sorted(arr, reverse=True)[:4])) # 14
# Or print(sum(sorted(arr)[-4:])) instead of the last print.
添加回答
举报
0/150
提交
取消