Назначение списка из индекса

#python #indexing

#python #индексирование

Вопрос:

У меня есть следующая программа, которая присваивает ключи словаря массиву ( 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
 

Ответ №1:

В 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. Хороший ответ. list.append() — это обычный способ Python сделать это.

Ответ №2:

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

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

 addr = list(clnts.keys())
 

Ответ №3:

Использовать 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())
 

Если вы чувствуете себя смелым, попробуйте list comprehensions .


Однако вскоре вы обнаружите другую проблему:

 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'
 

Я позволю вам взять это оттуда.

Комментарии:

1. Конечно, есть более элегантные способы повторения clnts , но здесь это не относится к делу.