Python 列表不保留信息,一旦成功存储



我有一个正在读取的文件,它是这样的:

/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 ...

(*) 当然不是你,而是错误:-)

相关内容

最新更新