Как исправить ошибку «индексы списка должны быть целыми числами или ломтиками» - PullRequest
2 голосов
/ 09 апреля 2019

Я делаю программу, которая должна сохранять ваш IP-адрес в списке в отдельном файле, используя полку.Каждый раз, когда он открывается, он должен указать свой IP-адрес в списке «pubipcount» в списке «pubiplist».Когда я иду, чтобы добавить новый ip, я получаю ошибку, которую я не понимаю.

Я только побежал код постепенно, чтобы найти часть, которая сломана, и я взял на себя свободусузить его до той информации, которая нужна мне для помощи.Я уже искал в Интернете возможный ответ, но не нашел ничего полезного для меня.

import shelve
import socket
import urllib.request

save = shelve.open('ip_whitelist', writeback=True)

hostname = socket.gethostname()
PubIP = urllib.request.urlopen('https://ident.me').read().decode('utf8')
LocIP = socket.gethostbyname(hostname)

save['pubipcount'] = 0
save['pubiplist'] = []

save['pubipcount'] = save['pubipcount'] + 1
save['pubiplist']['pubipcount'] = PubIP

Это точная ошибка:

Traceback (most recent call last):
  File "C:\Users\brenn\Desktop\IP\ip.py", line 27, in <module>
    save['pubiplist']['pubipcount'] = PubIP
TypeError: list indices must be integers or slices, not str

Ответы [ 3 ]

1 голос
/ 09 апреля 2019

если вы используете list, индекс должен быть целым числом, таким как save['pubiplist'][0]

если вы хотите str в качестве ключа, вы можете вместо этого использовать dict, изменив save['pubiplist'] = [] на save['pubiplist'] = {}


для вашей ситуации, я предлагаю вам использовать PubIP в качестве ключа и считать PubIP отдельно:

from collections import defaultdict
# do this only once
save['pubiplist'] = defaultdict(int)

# recieve IP repeately

# update IP and count each time
save['pubiplist'][PubIP] += 1
1 голос
/ 09 апреля 2019

Полка позволяет вам использовать строки в качестве ключей, но вы не можете использовать их в качестве субиндексов.

Самым быстрым решением было бы интерполировать счет в ключ:

save[f'pubiplist-{pubipcount}'] = PubIP
1 голос
/ 09 апреля 2019

Проблема ['pubipcount'].В контексте это просто строка.Я полагаю, что вы хотите:

save['pubiplist'][save['pubipcount']] = PubIP

Таким образом, вы ссылаетесь на значение в save['pubipcount'] вместо строки 'pubipcount' в качестве индекса.

Редактировать: Это, вероятно, приведет кIndexError, поэтому лучше использовать append()

save['pubiplist'].append(PubIP)
...