python列表索引必须是整数而不是字符串

时间:2013-07-19 14:47:48

标签: python python-3.x

我正在尝试编写一个加密文件的基本算法。它取字符串中每个字符的ASCII值,并根据密码的长度向上或向下移动一个数量,然后您可以在顶部分层更多的密码。

def encrypt(s):
    lenStr=s.__len__() #used later for working how far the int is moved
    s=list(s) #converts the string to a list
    for x in s:
        s[x]=ord(s[x]) #the same index of the list is = to the value of the string
        s[x]=chr(s[x])#is where it eventualy gets changed back to a str

s=ord(s)是抛出错误的行,我在它周围添加了int()但没有帮助,同样的错误

3 个答案:

答案 0 :(得分:1)

x是字符串中的字符,而不是整数。让我来说明一下:

>>> s = list('abcd')
>>> for x in s:
...     print(x)
...
a
b
c
d
>>>

您希望x是从0到字符串长度的整数值,如下所示:

>>> for x in range(len(s)):
...     print(x)
...
0
1
2
3
>>>

所以,你的函数应该看起来像这样(未经测试):

def encrypt(s):
    lenStr=s.__len__() #used later for working how far the int is moved
    s=list(s) #converts the string to a list
    for x in range(len(s)):
        s[x]=ord(s[x]) #the same index of the list is = to the value of the string
        s[x]=chr(s[x])#is where it eventualy gets changed back to a str

答案 1 :(得分:1)

我猜这是你的目标:

def encrypt(s):
    offset = len(s)
    return ''.join(chr(ord(c) + offset) for c in s)

def decrypt(s):
    offset = len(s)
    return ''.join(chr(ord(c) - offset) for c in s)

一些提示:

  • 使用len(s)代替lenStr=s.__len__()
  • 在代码中首次使用它们附近的命名值可提高可读性。
  • 选择描述值使用的名称。
  • 字符串是可迭代的,与列表相同。无需将字符串转换为列表。
  • 尽可能地学习和使用列表推导和生成器,它们通常更快,更简单,更易于阅读,并且不易出错。
  • 请记住接受和/或提出有用的答案。

答案 2 :(得分:1)

您获得了TypeError例外,因为x语句中s[x]=ord(s[x])的值是s列表中的一个元素,因此它&# 39; s传递给encrypt()的字符串参数中的单个字符。要解决这个问题,只需遍历s列表的所有可能索引,这些索引恰好与原始字符串的长度相同:

def encrypt(s):
    lenStr=len(s)
    s=list(s) # convert the string to a list
    for i in range(lenStr):
        s[i]=ord(s[i])
        s[i]=chr(s[i])

这将允许您的代码运行而不会出现该错误。根据您要实施的加密算法的描述,需要注意的一件事是生成0-255范围之外的非法8位字符值。您可以通过简单地将mod运算符%应用于中间结果来避免该问题,从而将值保持在适当的范围内。这就是我的意思:

def encrypt(s):
    lenStr = len(s)
    s = list(s) # convert the string to a list
    for i in range(lenStr):
        s[i] = chr((ord(s[i]) + lenStr) % 256)
    return ''.join(s) # convert list back into a string

同样,在解密字符串时,您必须做同样的事情:

def decrypt(s):
    lenStr = len(s)
    s = list(s) # convert the string to a list
    for i in range(lenStr):
        s[i] = chr((ord(s[i]) - lenStr) % 256)
    return ''.join(s) # convert list back into a string

enc = encrypt('Gnomorian')
print('encrypted:', enc)
dec = decrypt(enc)
print('decrypted:', dec)

输出:

encrypted: Pwxvx{rjw
decrypted: Gnomorian

另请注意,并非所有ord()值都在0-255范围内的字符都是可打印的,因此您可能希望限制加密转换,如果需要(加密的话)版本可打印)。