我在大学里被分配编写一个程序,该程序将使用用户名和姓氏创建用户密码(例如: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))
答案 0 :(得分:2)
您可以将itertools.zip_longest
与fillvalue
一起使用,以处理不等长的情况。
使用列表理解:
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
奥斯汀的答案是解决这个问题的最干净的方法。