Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TypeError: 'NoneType' object is unsubscriptable

Tags:

python

I have a python program that produces an error:

def update_ranges(phonemelist) :
    """ updating the rows and columns of the list of input phonemes"""
    # make a copy of the list as we're going to modify it (optional)
    phonlist = phonemelist[:]
    # we don't need the row titles, they just complicate things
    rowtitles, phonlist = zip(*phonlist)
    rows = len(phonlist)
    columns = range(len(phonlist[0]))

    # for each row except the last
    for i in xrange(rows - 1):
        # update it by going down all the rows below it
        for k in xrange(i+1, rows):
            # for both columns
            for j in columns:
                update(phonlist, i, j, k, j)

    # put the row titles back in (optional)
    phonlist = zip(rowtitles, phonlist)
    return phonlist

def update(phonlist, curr_row, curr_col, next_row, next_col) :
    """ applying co-articulation rules for comparing the ranges """
    curr_low, curr_high = phonlist[curr_row][curr_col]
    next_low, next_high = phonlist[next_row][next_col]

    # Rule 1: when one of the ranges is (-1,-1)
    # replace the current range if it's (-1, -1) as its empty
    if (curr_low, curr_high) == (-1, -1) :
        phonlist[curr_row][curr_col] = next_low, next_high
        return
    # do nothing if the next range is (-1,-1)
    if (next_low, next_high) == (-1, -1) :
        return

    # Rule 2: when ranges don't overlap
    # replace the lowest value of current range when the next range is lower than the  current range   
    elif curr_low > next_high :
        phonlist[curr_row][curr_col] = curr_low, curr_low
        return 
    # replace the highest values of current range when the next range is higher than the current range
    elif next_low > curr_high :
        phonlist[curr_row][curr_col] = curr_high, curr_high 
        return 

    # Rule 3: when ranges completely overlap
    elif curr_low <= next_low and next_high <= curr_high or curr_low >= next_low and   next_high >= curr_high :
        # replace the values of the next range when the next range completely lies in the current range
        if curr_high - curr_low > next_high - next_low : 
            phonlist[curr_row][curr_col] = next_low, next_high
            return
        # replace the values of the current range when the current range completely lies in the next range
        else :
            phonlist[curr_row][curr_col] = curr_low, curr_high
            return

    # Rule 4: when the ranges partially overlap
    else :
        # replace the values that is common to both ranges when next range is further ahead of the current
        if curr_low < next_low and curr_high < next_high :
            phonlist[curr_row][curr_col] = next_low, curr_high
            return
        # replace the values that is common to both ranges when current range is further ahead of the next
        else :
            phonlist[curr_row][curr_col] = curr_low, next_high
            return 

Error:

File "coarticulation.py", line 217, in update
    next_low, next_high = phonlist[next_row][next_col]
TypeError: 'NoneType' object is unsubscriptable

What does the error mean and how do I fix it?

like image 756
zingy Avatar asked Aug 11 '11 23:08

zingy


2 Answers

This is the error that Python returns when you try to access a subscripted (indexed) value from the None value (Python's null equivalent):

>>> a = None
>>> a[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'NoneType' object is not subscriptable
like image 106
Drew Noakes Avatar answered Oct 08 '22 11:10

Drew Noakes


It isn't a problem with this part of code. It means either

phonlist

or

phonlist[next_row]

is not a list(or an subscritable type), a None. Look for where you creating the list.

Edit:

curr_low, curr_high = phonlist[curr_row][curr_col]
next_low, next_high = phonlist[next_row][next_col]

Because the error is in the second line, I think phonlist[next_row] is None.

like image 27
utdemir Avatar answered Oct 08 '22 13:10

utdemir