#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
, но здесь это не относится к делу.