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

通过迭代更改列表的元素(python),python,list,loops,indexing,Python,List,Loops,Indexing,我试图遍历一个列表(用户输入的范围),首先假设所有数字都是素数(p),然后让程序遍历该列表。当列表中的元素为P时,我希望迭代该范围内的所有倍数并将其更改为N。当元素为N时,我希望程序移动到下一个数字(我将0和1设置为非素数,因为它们是例外)。我在索引方面遇到了一个问题,但是,我得到了一个错误: list1[number1] = 'N' IndexError: list assignment index out of range 当我运行这个程序时,我有。代码如下: # input n =

我试图遍历一个列表(用户输入的范围),首先假设所有数字都是素数(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 
#输入
n=int(输入(“输入一个大于或等于10的正整数:”)
当n<10时:
打印(“无效!重试”)
int(输入(“输入一个大于或等于10的正整数:”)
#创建列表
新的n=n+1
列表1=['P']*新建
#设非素数
列表1[0]=“N”
列表1[1]=“N”
#设置循环
计数器=0
对于列表1中的x:
计数器1=2
如果列表1[计数器]=“P”:
对于列表1中的y:
number1=计数器*计数器1
列表1[number1]=“N”
计数器1+=1
计数器+=1
其他:
计数器+=1
任何帮助都将不胜感激!谢谢

list1[number1] = 'N'
IndexError: list assignment index out of range
这意味着number1是一个大于列表中项目总数的数字

问题出在
number1=计数器*计数器1
行中。假设列表1中有10项,当您使用数字10作为计数器时,您将尝试访问列表中的第100项,即使其中只有10项。(计数器*counter1或10*10=100(实际上计数器是从2开始的,所以它会是一个更大的数字,但你得到了分数))


这也是一个很好的提示。相反,实现算法将大大加快速度。

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

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

您还必须将
计数器+=1
置于
else
语句之外。否则,您将只设置2的倍数(一旦您从
计数器1
的循环中提取
计数器+=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
以下是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']

编辑:
计数器+=1
置于else语句之外

您可以这样更新代码:

# 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
#设置循环
对于范围内的计数器(len(列表1)):
如果列表1[计数器]=“P”:
数字1=2*计数器
而编号1<新\n:
列表1[number1]=“N”
数字1+=计数器

提示:使用
枚举()
,而不是原始索引循环。它将允许您同时访问元素及其相应的索引。@AkshatMahajan谢谢!我现在正在这么做。但是,如果我已经列举了这个列表,我怎么能仅仅索引与该列表中某个元素对应的数字呢。例如,在(2,P)这样的枚举列表中,我如何将2作为一个int进行索引?您希望对enumerate(list1)中的index,item执行
操作
以访问
item
的相应索引。您的代码中没有任何内容可以阻止程序尝试将超出用户指定范围的值设置为“N”。例如,如果用户选择11,如果
计数器
为2,而
计数器1
为6,则算法将尝试将元素12设置为“N”。但是,在本例中,由于
len(list1)
为11,因此会出现一个错误。看起来您需要在计数器上添加约束。
# 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