我正在尝试遍历列表(用户输入的范围),首先假设所有数字都是素数(P),并让程序遍历列表。当列表中的元素是P时,我想迭代范围内的所有倍数并将它们更改为N.当元素为N时,我希望程序移动到下一个数字(我将0和1设置为不是素数,因为他们是例外)。我遇到了索引问题但是我得到了错误:
list1[number1] = 'N'
IndexError: list assignment index out of range
当我运行程序时,我有。这是代码:
# input
n = int(input("Enter a positive integer greater than or equal to 10: "))
while n < 10:
print ("Invalid! Try again")
int(input("Enter a positive integer greater than or equal to 10: "))
# create list
new_n = n + 1
list1 = ['P'] * new_n
# set non prime
list1[0] = 'N'
list1[1] = 'N'
# set up loop
counter = 0
for x in list1:
counter1 = 2
if list1[counter] == 'P':
for y in list1:
number1 = counter * counter1
list1[number1] = 'N'
counter1 += 1
counter += 1
else:
counter += 1
任何帮助将不胜感激!感谢。
答案 0 :(得分:2)
在循环中,您只将平方值设置为非素数,因为您在counter
的循环中迭代counter1
。
然后你必须检查number1
是否小于list1
的大小。
您还必须将counter+=1
放在else
声明之外。否则,您只会设置2的倍数(一旦从counter+=1
的循环中撤消counter1
)。
所以这段代码可行:
# set up loop
counter = 0
for x in list1:
counter1 = 2
if list1[counter] == 'P':
for y in list1:
number1 = counter * counter1
if number1 < len(list1):
list1[number1] = 'N'
counter1 += 1
counter += 1
此外,您应该使用enumerate
和range
简化代码:
# set up loop
for i, val in enumerate(list1):
if val == 'P':
for j in range(2, len(list1)):
if i*j < len(list1):
list1[i*j] = 'N'
else:
break
这是n = 12的结果:
Enter a positive integer greater than or equal to 10: 12
['N', 'N', 'P', 'P', 'N', 'P', 'N', 'P', 'N', 'N', 'N', 'P', 'N']
修改:将counter+=1
置于其他声明
答案 1 :(得分:1)
list1[number1] = 'N'
IndexError: list assignment index out of range
这意味着number1的数字大于列表中项目的总数。
问题在于number1 = counter * counter1
行。让我们说list1中有10个项目,当你使用数字10作为计数器时,你将试图访问列表中的第100个项目,即使那里只有10个项目。 (计数器* counter1或10 * 10 = 100(实际上计数器从2开始,所以它将是一个更大的数字,但你明白了))
也是一个不错的小提示。相反,实现Sieve of Eratosthenes算法将大大加快速度。
答案 2 :(得分:0)
您可以像这样更新您的代码:
# set up loop
for counter in range(len(list1)):
if list1[counter] == 'P':
number1 = 2 * counter
while number1 < new_n:
list1[number1] = 'N'
number1 += counter