2016-04-24 19 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)のような列挙型リストでは、intとして2をどのようにインデックスするのでしょうか? –

+0

あなたは 'for index、item in enumerate(list1)'を実行して 'item'の対応するインデックスにアクセスしたいとします。 –

答えて

2

counter1のループでcounterを反復処理するため、ループ内では2乗値のみを非プライムに設定しています。

number1list1のサイズより小さいかどうかを確認する必要があります。

counter+=1elseの外側に置く必要があります。それ以外の場合は、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'] 

編集: Puトンcounter+=1外else文

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

つまり、number1はリスト内のアイテムの合計数よりも大きい数値です。

問題はラインnumber1 = counter * counter1にあります。リスト10のアイテムは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 
関連する問題