[英]Changing the elements of a list by iteration (python)
我正在嘗試迭代列表(用戶輸入的范圍),首先假設所有數字都是素數(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
任何幫助,將不勝感激! 謝謝。
在循環中,您只將平方值設置為非素數,因為您在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
此外,您應該使用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
list1[number1] = 'N'
IndexError: list assignment index out of range
這意味着number1的數量大於列表中項目的總數。
問題在於行號1 number1 = counter * counter1
。 讓我們說list1中有10個項目,當你使用數字10作為計數器時,你將試圖訪問列表中的第100個項目,即使那里只有10個項目。 (計數器* counter1或10 * 10 = 100(實際上計數器從2開始,因此它將是一個更大的數字,但你明白了))
也是一個不錯的小提示。 實施Eratosthenes算法篩選將大大加快速度。
您可以像這樣更新您的代碼:
# 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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.