Vincent A
Vincent A

Reputation: 77

Out of range issue within a loop

I try to make a script allowing to loop through a list (tmpList = openFiles(cop_node)). This list contains 5 other sublists of 206 components. The last 200 components of the sublists are string numbers ( a line of 200 string numbers for each component separated with a space character).

I need to loop through the main list and create a new list of 5 components, each new component containing the 200*200 values in float.

My actual code is try to add a second loop to an older code working with the equivalent of one sublist. But python return an error "Index out of range"

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)

Upvotes: 2

Views: 77

Answers (2)

Vincent A
Vincent A

Reputation: 77

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

After little modification I get it to work as excepted :

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)

I don't understand why but the first loop statement didn't work. At the end the I had empty lists like so : [[],[],[],[],[]] . That's why I changed the beginning. Finally I converted the strings to floats.

Upvotes: 0

Padraic Cunningham
Padraic Cunningham

Reputation: 180411

valueListStr = []*len(tmpList) does not do what you think it does, if you want a list of lists use a list comp with range:

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

That will create a list of lists:

In [9]: valueListStr = [] * i

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

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

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

So why you get an error is because of valueListStr[j].extend(splitList), you cannot index an empty list.

You don't actually seem to return the list anywhere so I presume you actually want to actually return it, you can also just create lists inside the loop as needed, you can also just loop over tmpList and 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

Which using itertools.chain can become:

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)]

Upvotes: 2

Related Questions