我正在努力解决问题。在尝试更改列表值时,我发现了一个奇怪的列表行为。我无法更改列表元素的值。
top = list(map(int, raw_input().split()))
staff = list(map(int, raw_input().split()))
ceo = top[0]
coo = top[1]
cto = top[2]
top.extend(staff)
alls = sorted(top)
tot = len(alls)
print(alls)
alls[tot/2], alls[alls.index(ceo)] = alls[alls.index(ceo)], alls[tot/2]
print(alls)
alls[0], alls[alls.index(coo)] = alls[alls.index(coo)], alls[0]
alls[-1], alls[alls.index(cto)] = alls[alls.index(cto)], alls[-1]
print(alls)
以下是该计划的输出:
输入:
13 11 17
12 10
输出
[10, 11, 12, 13, 17]
[10, 11, 12, 13, 17]
[10, 11, 12, 13, 17]
为什么所有列表值都没有变化?我做错了吗?
编辑: 问题陈述:https://www.hackerearth.com/codejunk/algorithm/steal-the-show/
我知道我的方法不是解决这个问题的最佳方法,但我只是想知道为什么列表的值没有改变?
答案 0 :(得分:4)
这里的问题是你的运营商组合。我以第一个作业为例进行剖析:
alls[tot/2], alls[alls.index(ceo)] = alls[alls.index(ceo)], alls[tot/2]
会发生什么:
ceo在开头是13,所以当执行语句时,alls.index(ceo)将为3 ...但是等待... 之前分配
首先评估分配前的值。 alls [alls.index(ceo)]将是13 - 难怪,因为首席执行官是13岁。
alls [tot / 2]将为12,因为tot / 2为2(索引将为整数,因此逗号后面的部分将丢失)。
所以在右侧我们会得到(13,12)。
现在,到了作业。将首先分配alls [tot / 2](但你不能相信它,因为这是实现细节!)。
所以alls [2]将是13 !!
现在,作业的第二部分...... alls.index(首席执行官)将是2 ....什么?
原因是,alls目前持有[10,11,13,13,17] ......并且alls.index(ceo)将被评估并在位置2找到13,然后找到其他13位置3。
那么会发生什么 - 所有人[2]将被分配12 - 该列表又回到之前的内容。
原因是,您使用组合运算符并始终进行评估 新的子表达式没有考虑到,那个子表达式 将在评估过程中发生变化。
您可以通过将某些子表达式的结果分配给,来防止这种情况发生 变量并使用它们而不是使表达式复杂化。 具体来说,可能会在内部发生变化的子表达式 主表达式应该在表达式之前进行评估 存储在变量中。