列表索引超出文本输入的嵌套列表的范围

时间:2018-07-18 16:56:00

标签: python

meteo = open('meteo.txt', 'r+')
meteo.seek(0, 0)
ar = []
a=True
x=0
while a:
    com=[meteo.readline(), meteo.readline(), meteo.readline()]
    ar.append(com)
    print(ar[x], '___', com)
    com.clear()
    if ar[x][0] == '':
        a=False
    x=x+1

我收到此错误:

Traceback (most recent call last):
  File "C:\Users\Utente\Desktop\DEV - enviroment\Python\Script\Es. 56 Pag. 157.py", line 11, in <module>
    if ar[x][0] == '':
IndexError: list index out of range

我认为错误在于列表中的元素数量,但我无法解决。

3 个答案:

答案 0 :(得分:2)

那是因为列表的浅表复制或更好的表达;引用而不是将值复制到内存中。如果要使用清除功能,则需要深度复制com列表。这是您目前的操作:

>>> li = []
>>> inli = [1, 2, 3]
>>> li.append(inli)
>>> li
[[1, 2, 3]]
>>> inli
[1, 2, 3]
>>> inli.clear()
>>> li
[[]]
>>> inli
[]

您需要做的是:

>>> import copy
>>> li = []
>>> inli = [1, 2, 3]
>>> li.append(copy.deepcopy(inli))
>>> li
[[1, 2, 3]]
>>> inli
[1, 2, 3]
>>> inli.clear()
>>> li
[[1, 2, 3]]
>>> inli
[]

或者更好的是根本不使用清除功能:

>>> li = []
>>> inli = [1, 2, 3]
>>> li.append(inli)
>>> li
[[1, 2, 3]]
>>> inli
[1, 2, 3]
>>> inli = [4, 5, 6]
>>> li
[[1, 2, 3]]
>>> inli
[4, 5, 6]

答案 1 :(得分:1)

逻辑是,您将三行读入列表com,将列表 intoto 附加到ar,然后清除子列表。 ar拥有对com的引用,而不是它自己读取的三个字符串的副本。

清除com时,来自ar的引用也会被清除; ar[x]现在是一个空列表,没有元素0。

您需要复制元素;使用deepcopy,或者重构您的逻辑以执行所需的操作;对于此代码段尝试执行的操作,您发布的代码不必要地复杂。例如,com对于将行插入ar并检测空行实际上并没有多大作用。

答案 2 :(得分:-2)

我可能错了,但我认为您需要更改此行

x=x+1

收件人

x+=1

像这样设置ar变量:

ar=([meteo.readline(), meteo.readline(), meteo.readline()])

据我所知,这是完全一样的