我有以下类型的数据,我想收集到一个大列表中,以便大列表中的每一行都有以下其中之一(c-d 和 e-f 对应于其中的第二个和第三个(。我的意思是lista_results[0]包括其中的第一个和lista_results[1]第二个等。
(Name) (Amount-of-points)
Some name 12
Other name 19
... ...
我有一个循环,它从其他列表中获取信息,然后将其添加到结果列表中。代码如下行:
lista_results = []
lista_temp = []
for y in range(0,10):
for x in range(0,10):
lista_temp.append(name_list[y][x], point_list[y][x])
lista_results.append(lista_temp)
#lista_temp[:] = []
如果不清空,则每次 x 循环完成时,所有内容都会附加到同一列表中。基本上我得到的是:
[0]["Some name",12]
[0]["Other name",19]
[1]["Some name",12]
[1]["Other name",19]
[1][c,1c]
[1][d,2d]
[2]["Some name",12]
[2]["Other name",19]
[2][c,1c]
[2][d,2d]
[2][e,1e]
[2][f,2f]
...
但我想要的是:
[0]["Some name",12]
[0]["Other name",19]
[1][c,1c]
[1][d,2d]
[2][e,1e]
[2][f,2f]
...
这意味着在将lista_temp附加到lista_results后,我将不得不以某种方式清空。但是当我清空它时(使用 #lista_temp[:] = [](,似乎附加到lista_results的部分也被清空了,或者至少我在尝试打印出 lista_results[0][0][0] 时出现"IndexError"。我假设机器人引用相同的列表并清空其中一个也会清空另一个。
我也尝试了 lista_newtemp=lista_temp,即便如此,我在清空lista_temp后也得到了一个 IndexError。
在追加后清空lista_temp而不丢失已追加的先前信息的方法是什么?
(另外,我在这里的第一个问题,我希望我做得好。我希望问题解释清楚。感谢反馈!
从输出样本中很难判断您正在处理哪些数据,但在我看来,您不想清空列表,而是为下一次迭代创建一个新列表。像这样:
lista_results = []
for y in range(0,10):
lista_temp = [] # we have a new lista_temp for every y
for x in range(0,10):
lista_temp.append(something_here)
lista_results.append(lista_temp)
你看到的行为是因为 Python 通常不会制作隐式副本。附加到lista_results中的每个lista_temp都是同一个对象,而对象又不断变化。
使用列表推导会更 Pythonic。
内部列表 lista_temp
可以像这样创建:
lista_temp = [something_here for x in range(0, 10)]
外部列表 lista_results
可以像这样创建:
lista_results = [make_lista_temp(y)
for y in range(0, 10)]
您可以组合它们,并丢失临时变量lista_temp:
lista_results = [[something_here for x in range(0, 10)]
for y in range(0, 10)]
编辑:
你的主要问题是你没有复制lista_temp
,所以lista_results
的每个元素都指向lista_temp
指向的同一个实例。你可以像这样复制它:
lista_results.append(list(lista_temp))
但是,如上所述,有更好的方法。