2016-04-24 62 views
1

我想通过列表(用户输入的范围)迭代,首先假定所有数字都是素数(P),并让程序遍历列表。当列表中的元素为P时,我想遍历范围内的所有倍数并将它们改为N.当元素为N时,我希望程序移动到下一个数字(我将0和1设置为不是素数因为它们是例外)。我遇到索引问题,但是,我得到的错误:通过迭代(python)更改列表元素

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 

任何帮助,将不胜感激!谢谢。

+2

提示:使用'枚举()',而不是一个原始指数环。它会让您同时访问元素及其相应的索引。 –

+0

@AkshatMahajan谢谢!我现在正在这样做。但是,如果我列举了列表,我怎么能索引与列表中的元素相对应的数字。例如,在像(2,P)这样的枚举列表中,我如何将2作为int来索引? –

+0

你想要做'对于索引,枚举(list1)'中的项来访问'item'的相应索引。 –

回答

2

在循环中,由于您在counter1的循环中迭代counter,因此您只将平方值设置为非素数。

然后您必须检查number1是否小于list1的大小。

您还必须将counter+=1置于else之外的声明。否则,您将只设置2的倍数(一旦您从counter1的循环撤回counter+=1)。

所以此代码的工作:

# 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 

此外,你应该使用enumeraterange简化代码:

# 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外else语句

1
list1[number1] = 'N' 
IndexError: list assignment index out of range 

这意味着number1是一个比列表中的项目总数更大的数字。

问题出在线number1 = counter * counter1。比方说,在list1中有10个项目,当你使用数字10作为计数器时,你将试图访问列表中的第100个项目,即使这里只有10个项目。 (计数器*计数器1或10 * 10 = 100(实际上计数器从2开始,所以它会是一个更大的数字,但你明白了))

另外一个很好的小提示。实施一个Sieve of Eratosthenes算法反而会大大加快速度。

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