如何修复“列表索引必须是整数或片”

2024-10-03 11:20:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个程序,应该保存您的ip地址到一个单独的文件列表中使用搁置。每次打开时,它都应该将ip地址放在列表“pubiplist”中的列表“pubicount”中。当我去添加一个新的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

Tags: import程序ip列表requestsave地址错误
3条回答

如果使用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

问题是['pubipcount']。在上下文中,它只是一个字符串。我相信你想要:

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

这样,您将引用save['pubipcount']中的值,而不是字符串'pubipcount'作为索引。你知道吗

编辑: 这可能会导致索引错误,因此使用append()更好

save['pubiplist'].append(PubIP)

Shelve允许将字符串用作键,但不能将其用作子索引。你知道吗

最快的解决方法是将计数插入到键中:

save[f'pubiplist-{pubipcount}'] = PubIP

相关问题 更多 >