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

时间:2016-04-24 23:01:27

标签: python list loops indexing

我正在尝试遍历列表(用户输入的范围),首先假设所有数字都是素数(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 

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

3 个答案:

答案 0 :(得分:2)

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

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

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

所以这段代码可行:

# 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置于其他声明

之外

答案 1 :(得分:1)

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

这意味着number1的数字大于列表中项目的总数。

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

也是一个不错的小提示。相反,实现Sieve of Eratosthenes算法将大大加快速度。

答案 2 :(得分: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