Список назначений вне индекса - PullRequest
0 голосов
/ 01 ноября 2011

У меня есть следующая программа, которая назначает словарные ключи для массива (addr[]) и значения для соответствующего массива (msg[])

import smtplib  

class item:
    id = 0 # next available Item ID
    def __init__(self,startBid,desc):
        self.id = item.id
        item.id += 1
        self.highBid = startBid
        self.highBidder = None
        self.desc = desc
        self.isopen = True

item1 = item(200.30, "bike with a flat tire")
item2 = item(10.4, "toaster that is very large")
item3 = item(40.50, "computer with 8 gb of ram")

clnts = {'test@hotmail.com':[item1,item3], 'test@yahoo.com':[item2] }

def even(num):
    if (num % 2 == 0):
        return True
    else:
        return False

def getmsg(clnts):
    index = 0
    j = 0
    msg = []
    addr = []

    for key in clnts:
        addr[j] = key
        for key in values:
            msg[j] += str(key.highbidder()) + key.highbid()
            index += 1
            j += 1

getmsg(clnts)

Я пытался и пытался это исправить, но постоянно получаю сообщение об ошибке:

line 39, in getmsg
    addr[j] = key
IndexError: list assignment index out of range

Ответы [ 3 ]

4 голосов
/ 01 ноября 2011

В Python нельзя присвоить индекс, который еще не существует:

>>> x = []
>>> x[0] = True
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list assignment index out of range

Вместо

addr[j] = key

Попробуйте

addr.append(key)

Вы могли бы покончить с j в целом, потому что вам придется сделать то же самое с msg.

Есть некоторые другие проблемы с вашим кодом, которые не являются частью вашего вопроса; Я предполагаю, что это просто ошибки в попытках сделать сводный пример для вопроса.

1 голос
/ 01 ноября 2011

addr = [] создает пустой список без элементов.Таким образом, addr [0] не существует, и попытка сохранить что-либо в несуществующем месте приведет к возникновению ошибки IndexError.Вместо этого попробуйте addr.append(key).

Или вместо использования цикла в стиле FORTRAN с индексом j, вы можете использовать больше Pythonic-методов для создания и инициализации списка за один шаг:

addr = list(clnts.keys())
0 голосов
/ 01 ноября 2011

Используйте list.append().

def getmsg(clnts):

    msg = []
    addr = []

    for key in clnts:
        addr.append(key)

        for key in values:
            msg.append(str(key.highbidder()) + key.highbid())

Если вы чувствуете себя смелым, попробуйте список пониманий .


ВыОднако вскоре мы обнаружим еще одну проблему:

NameError: global name 'values' is not defined

Полагаю, вам нужно значение, соответствующее каждому key в clnts:

def getmsg(clnts):

    msg = []
    addr = []

    for key in clnts:
        addr.append(key)

        for value in clnts[key]:
            msg.append(str(value.highbidder()) + value.highbid()) 

После чего выЯ найду другую проблему:

AttributeError: item instance has no attribute 'highbidder'

Я дам вам оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...