我正在尝试来自hackerrank的一些问题并遇到了这个问题 https://www.hackerrank.com/challenges/list-comprehensions/problem
我试过这个解决方案
if __name__ == '__main__':
x = int(input())
y = int(input())
z = int(input())
n = int(input())
L = []
SL = []
for i in range(0, x + 1):
for j in range(0, y + 1):
for k in range(0, z + 1):
if i + j + k != n:
SL[:] = []
SL.append(i)
SL.append(j)
SL.append(k)
print(SL)
L.append(SL)
print(L)
虽然SL有正确的解决方案但由于某种原因我不能将SL附加到主列表L,并且显然L.append(SL)在每次执行时都会覆盖列表L,因为它会打印SL的最后一个值。 为什么会这样? 我尝试使用extend,但它不是使它成为列表列表,而是创建为一个整数列表。 编辑:谢谢大家的解释!
答案 0 :(得分:2)
确实,您的代码不起作用,这是由于行position: absolute
:它会更改SL[:] = []
引用的列表的内容。通过这样做,您可以更改SL
的所有元素,因为您始终会将L
引用的列表附加到循环中的SL
。用L
替换将解决问题,因为在这种情况下,您创建一个新列表而不会覆盖前一个列表。
它可以修复,并且更易于阅读(如果需要),并提供以下建议:
SL = []
x = 1,y = 2,z = 3,n = 4:它给出了以下输出:
L = []
for i in range(0, x + 1):
for j in range(0, y + 1):
for k in range(0, z + 1):
if i + j != n and i + k != n and k + j != n and i + j + k != n:
L.append([i, j, k])
print(L)
答案 1 :(得分:0)
此行通过删除所有项目来清除列表。该列表保持相同的变量(相同的对象),只修改其内容:
SL[:] = []
稍后在代码中就是这一行(在一个循环中):
L.append(SL)
但SL每次都是相同的变量。 L
中的所有项目都引用相同的列表SL
。因此,在修改SL
时,L
中的所有项目都会引用SL
的新内容。
这可以通过为每个结果创建一个新列表来解决。