在Python中生成密码的程序中的字符串索引超出范围错误

时间:2018-09-29 16:17:02

标签: python

我在大学里被分配编写一个程序,该程序将使用用户名和姓氏创建用户密码(例如:name ='John',surname ='Smith'=>密码将为'JSomhinth',但我得到了“ IndexError:字符串索引超出范围”错误。

name = input("Enter your name: ")
surname = input("Enter your surname: ")
print("Your credentials are %s %s." %(name, surname))

length = int((len(name) + len(surname))/2)
password = []
x = 0
y = 0
if len(name)>len(surname):
    for i in range(0, length):
        for n in range(0, len(name)):
            password.append(name[x])
            x += 1
            break
        for m in range(0, len(surname)):
            password.append(surname[y])
            y += 1
            break
print(''.join(password))

2 个答案:

答案 0 :(得分:2)

您可以将itertools.zip_longestfillvalue一起使用,以处理不等长的情况。

使用列表理解:

from itertools import zip_longest

name = 'John'
surname = 'Smith'

print(''.join([x + y for x, y in zip_longest(name, surname, fillvalue='')]))
# JSomhinth

或使用map

print(''.join(map(''.join, zip_longest(name, surname, fillvalue=''))))
# JSomhinth

答案 1 :(得分:0)

问题在这里:

if len(name)>len(surname):
    for i in range(0, length):
        for n in range(0, len(name)):
            password.append(name[x])
            x += 1
            break
        for m in range(0, len(surname)):
            password.append(surname[y])
            y += 1
            break

每次您通过外部循环时,都会在内部循环上碰到姓氏并递增y。 由于姓氏比名字短,因此y最终将达到(len(name)+ len(surname))/ 2 -1,如果name至少为2,则surname[y]呼叫将超出范围字符长于姓。

在不相关的说明中,不需要内循环,因为每次内循环只运行一次,增加全局变量并中断,因此以下代码也可以工作

if len(name)>len(surname):
    for i in range(0, length):
        password.append(name[x])
        x += 1
        if y < len(surname):
            password.append(surname[y])
        y += 1

奥斯汀的答案是解决这个问题的最干净的方法。