2016-04-24 65 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