如何解决基于实现的问题上的索引超出范围错误

时间:2019-06-03 17:18:31

标签: python python-3.x

我正在练习python 3问题,但遇到一个问题。

小佩蒂亚非常喜欢礼物。最近,他从母亲那里收到了新的笔记本电脑作为新年礼物。他立即决定将它赠送给其他人,这比给别人礼物更令人愉快。这次他在自己的地方组织了一个新年晚会,并邀请了他的朋友们在那里。

如果Petya比接收礼物更喜欢一件事,那就是看着其他人向别人礼物。因此,他安全地将笔记本电脑藏起来直到下一个新年,并决定在不参加此过程的同时观看他的朋友交换礼物。他用1到n的整数来编号他所有的朋友。 Petya记得我给一个朋友号码送了礼物给一个朋友号码pi。他还记得他的每个朋友都收到了一份礼物。

现在Petya想为每个朋友知道我给他礼物的朋友的人数。

输入

第一行包含一个整数n(1≤n≤100)-Petya邀请参加聚会的朋友数量。

第二行包含n个以空格分隔的整数:第i个数字是pi-给朋友编号i送礼的朋友的编号。确保每个朋友都收到一份礼物。可能有些朋友不同意Petya赠送礼物给别人的想法。那些朋友把礼物给了自己。

输出

打印n个以空格分隔的整数:第i个数字应等于给礼物编号i送礼的朋友的编号。

代码:

n=int(input())
gifts=input().split()
""" Reverse_gifts is just dummy list so that I can place each integer at 
its required place""" 
reverse_gifts=[range(n)]

""" For converting each item of gifts to integer"""
for num in range(len(gifts)):
    gifts[num]=int(gifts[num])

""" It will change the items of reverse_gifts to the items we need in 
output"""
for num1 in range(1,n+1):
    guest_recieved_gift=gifts.index(num1)
    reverse_gifts[num1-1]=guest_recieved_gift+1

print(reverse_gifts)

"""For converting each item of reverse gifts to string"""  
for num2 in range(len(gifts)):   
    reverse_gifts[num2]=str(reverse_gifts[num2])

""" For converting final list into string and print it"""
final_gifts=" ".join(reverse_gifts)
print(final_gifts)

输入:

4
2 3 4 1

输出:回溯(最近一次通话最近):

File "Presents.py", line 11, in <module>
reverse_gifts[num1-1]=guest_recieved_gift+1
IndexError: list assignment index out of range

2 个答案:

答案 0 :(得分:1)

问题是您正在使用长度为1的reverse_gifts=[range(n)],因为当前它仅包含一个生成器。因此,由于尝试访问大于0的索引,所以最终得到IndexError。可以使用range <来解压缩*生成器的值以使其包含4个元素的列表。 / p>

reverse_gifts=[*range(n)]

替代方法是

reverse_gifts= list(range(n))

完整答案

n=4
gifts="2 3 4 1".split()
reverse_gifts=[*range(n)]

for num in range(len(gifts)):
    gifts[num]=int(gifts[num])

for num1 in range(1,n+1):
    guest_recieved_gift=gifts.index(num1)
    reverse_gifts[num1-1]=guest_recieved_gift+1
print(reverse_gifts)
# [4, 1, 2, 3]

for num2 in range(len(gifts)):
    reverse_gifts[num2]=str(reverse_gifts[num2])
final_gifts=" ".join(reverse_gifts)

print(final_gifts)
# 4 1 2 3

答案 1 :(得分:0)

您的编程错误在于初始化reverse_giftsrange(n)单个对象,一个迭代器。它不是n整数列表。简单的print(reverse_gifts)显示:

[range(0, 4)]

相反,请使用列表理解:

reverse_gifts=[i for i in range(n)]

现在您的程序将按预期执行。