簡體   English   中英

通過迭代更改列表的元素(python)

[英]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

此外,您應該使用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

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM