循环内超出范围的问题

2024-09-29 08:19:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着编写一个脚本,允许循环遍历一个列表(tmpList=openFiles(cop\u node))。此列表包含206个组件的其他5个子列表。 子列表的最后200个组件是字符串编号(每个组件由200个字符串编号组成的行,用空格分隔)。你知道吗

我需要遍历主列表并创建一个包含5个组件的新列表,每个新组件包含200*200的浮点值。你知道吗

我的实际代码是尝试向使用等效于一个子列表的旧代码添加第二个循环。但是python返回一个错误“索引超出范围”

def valuesFiles(cop_node):
tmpList = openFiles(cop_node)
valueList = []
valueListStr = []*len(tmpList)
for j in range (len(tmpList)):
    tmpList = openFiles(cop_node)[j][6:]
    tmpList.reverse()
    for i in range (len(tmpList)):
        splitList = tmpList[i].split(' ')
        valueListStr[j].extend(splitList)
        #valueList.append(float(valueListStr[j][i]))
return(valueList)

Tags: 字符串代码innode列表forlen组件
2条回答

valueListStr = []*len(tmpList)不做您认为它做的事情,如果您想要一个列表列表,请使用带有范围的列表comp:

valueListStr = [[] for _ in range(len(tmpList))]

将创建一个列表列表:

In [9]: valueListStr = [] * i

In [10]: valueListStr
Out[10]: []

In [11]: valueListStr = [[] for _ in range(i)]

In [12]: valueListStr
Out[12]: [[], [], [], []]

所以为什么会出现错误是因为valueListStr[j].extend(splitList),不能为空列表编制索引。你知道吗

实际上,您似乎没有在任何地方返回列表,因此我假设您确实希望返回它,您也可以根据需要在循环中创建列表,也可以在tmpListopenFiles(cop_node)上循环:

def valuesFiles(cop_node):
    valueListStr = []
    for j in openFiles(cop_node):
        tmpList = j[6:]
        tmpList.reverse()
        tmp = []
        for s in tmpList:
            tmp.extend(s.split(' '))
        valueListStr.append(tmp)
    return valueListStr

使用itertools.chain可以变成:

from itertools import chain
def values_files(cop_node):
    return  [list(chain(*(s.split(' ') for s in  reversed(sub[6:])))) 
             for  sub in openFiles(cop_node)]
def valuesFiles(cop_node):
valueListStr = []
for j in openFiles(cop_node):
    tmpList = j[6:]
    tmpList.reverse()
    tmp = []
    for s in tmpList:
        tmp.extend(s.split(' '))
    valueListStr.append(tmp)
return valueListStr

稍加修改后,我就可以正常工作了:

def valuesFiles(cop_node):
valueList = []
for j in range (len(openFiles(cop_node))):
    tmpList = openFiles(cop_node)[j][6:]
    tmpList.reverse()
    tmpStr =[]
    for s in tmpList:
        tmpStr.extend(s.split(' '))
    tmp = []
    for t in tmpStr:
        tmp.append(float(t))
    valueList.append(tmp)
return(valueList)

我不明白为什么第一个循环语句不起作用。最后,我得到了这样的空列表:[[],[],[],[],[],[]。所以我才改了开头。最后我把字符串转换成浮点数。你知道吗

相关问题 更多 >