我有一个正在读取的文件,它是这样的:
/m/09c7w0
9.15810037736e+12 3957219322.11
9085777777.78 2585810931.38
10000000000.0 0.0
3.6e+16 0.0
4.65962485769e+12 8.39090575309e+11
0.540909090909 0.25489586271
3.99875996113 2.79866987366
41.3330962083 29.8486587064
10000000000.0 0.0
2341215333.91 88390569.3568
/m/09c7w0
9.15810037736e+12 3957219322.11
9085777777.78 2585810931.38
10000000000.0 0.0
3.6e+16 0.0
4.65962485769e+12 8.39090575309e+11
0.540909090909 0.25489586271
3.99875996113 2.79866987366
41.3330962083 29.8486587064
10000000000.0 0.0
2341215333.91 88390569.3568
现在我正在读取此文件并将其存储在列表列表中。下面是 Python 代码。在elif
部分中,float(temp[0])
将正确的值传输到country_catgs_stats[c][2*v]
,float(temp[1][:-1])
将正确的值传输到country_catgs_stats[c][2*v+1]
,因此打印一切正常。
#!/usr/bin/env python
country_stats = open("country_stats")
lines_all = country_stats.readlines()
temp = [0.0] * 22
country_catgs_stats = [temp] * 241
c = 0
v = 0
c_inc = False
for line in lines_all:
temp = line.split('t')
if len(temp) == 1 and c_inc == True:
c_inc = False
c += 1
elif len(temp) == 2:
if c_inc == False:
c_inc = True
v = 0
country_catgs_stats[c][2*v] = float(temp[0])
country_catgs_stats[c][2*v+1] = float(temp[1][:-1])
print c, 't', 2*v, 't', float(temp[0]), country_catgs_stats[c][2*v], 't', 2*v+1, 't', float(temp[1][:-1]), country_catgs_stats[c][2*v+1]
v += 1
for i in range(0, 240):
for j in range(0, 10):
print country_catgs_stats[i][2*j], 't', country_catgs_stats[i][2*j+1]
但是一旦脱离1st
for
循环,当我第二次打印列表列表country_catgs_stats[c]
时,它什么也不打印 - 所有内容都打印为:
0.0 0.0
0.0 0.0
...
0.0 0.0
0.0 0.0
我正在争分夺秒地提交,这个问题在过去的 3.5 小时内让我发疯。我在这里避难。有人请帮忙。
附言。country_catgs_stats
的定义是否正确 - 还是那里潜伏着错误?
country_catgs_stats的定义不正确。尝试用较小的数字做同样的事情:
>>> temp = [0.0] * 5
>>> country_catgs_stats = [temp] * 5
>>> country_catgs_stats
[[0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0], [0.0, 0.0, 0.0, 0.0, 0.0]]
目前为止,一切都好。让我在 temp 中设置一件事:
>>> temp[0]=9
>>> country_catgs_stats
[[9, 0.0, 0.0, 0.0, 0.0], [9, 0.0, 0.0, 0.0, 0.0], [9, 0.0, 0.0, 0.0, 0.0], [9, 0.0, 0.0, 0.0, 0.0], [9, 0.0, 0.0, 0.0, 0.0]]
>>>
如果赋值进入country_catgs_stats,效果相同:
>>> country_catgs_stats[0][1] = 8
>>> country_catgs_stats
[[9, 8, 0.0, 0.0, 0.0], [9, 8, 0.0, 0.0, 0.0], [9, 8, 0.0, 0.0, 0.0], [9, 8, 0.0, 0.0, 0.0], [9, 8, 0.0, 0.0, 0.0]]
>>>
查看每个列表的变化情况。没有五个列表,但一个列表引用了五次。或者在您的代码中,同一个列表链接了 241 次。
它在运行时工作,因为您可以立即分配和打印,然后在下次通过循环覆盖它之前。
尝试
country_catgs_stats = []
for i in range(241):
country_catgs_stats.append([0.0] * 22)
多么恶毒(*)!
您试图通过预分配列表列表 ( country_catgs_stats
来解决在列表列表中重用内部列表的问题。但是你的做法更糟糕,因为 241 倍是同一个内temp
列表!
希望只需编写以下内容即可轻松修复:
country_catgs_stats = [ temp[:] for i in range(241) ]
因为现在你得到了 241 份 Temp ...
(*) 当然不是你,而是错误:-)