为什么for循环遍历(看起来)空列表?

2024-09-26 18:07:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我是一个初学者程序员,我决定写一个简单的程序,从一个数中提取素数因子,然后打印出来,但打印出来的结果却有困难。代码如下:

n = int(raw_input("Number?: "))
m = n
k = 2
czynniki = []       

while(m != 1):
    if m%k == 0:
        czynniki.append(k)
        print m, "\t", '|', k
        m = m/k
    else:
        k+=1
print m

print n, ' = ',
for czynnik in czynniki:
    if czynniki.count(czynnik)>1:
        print czynnik, '^', czynniki.count(czynnik), ' *',
        czynniki = filter(lambda x: x!=czynnik, czynniki)
    else:
        print czynnik, ' *',

一切都很好,直到最后。例如,当输入1025时,我希望它打印“1025=5^2*41”,但是它会打印“1025=5^2*5*41”,就好像过滤器函数没有任何影响一样。虫子在哪里?你知道吗


Tags: 代码程序inputrawifcountelse素数
3条回答

问题是您在迭代列表时正在修改它。请尝试以下操作:

print n, ' = ',
for czynnik in sorted(set(czynniki)):
    if czynniki.count(czynnik)>1:
        print czynnik, '^', czynniki.count(czynnik), '*',
    else:
        print czynnik, '*',

在这里,您将遍历一个单独的列表,其中只包含列表中唯一的项czynniki。这是通过将列表强制转换为一个集合(唯一项的未排序列表)然后返回到排序列表来实现的。你知道吗

如果您想在最后消除剩余的*,您可以尝试以下方法:

result_list = []
for czynnik in sorted(set(czynniki)):
    if czynniki.count(czynnik)>1:
        result_list.append(str(czynnik) + '^' + str(czynniki.count(czynnik)))
    else:
        result_list.append(str(czynnik))
print n, '=', ' * '.join(result_list)

在存储在czynniki中的列表上启动for循环,之后更改czynniki引用的内容(一个全新的列表)不会更改for循环所覆盖的列表。更改循环正在运行的实际列表也不安全,因此无论如何都不能这样做。你知道吗

您可能想重写循环,就像这样,只需跳过重复的值,而不是试图在运行时更改循环

var lastvalue = -1;
for czynnik in czynniki:
    if lastvalue == czynnik:
        continue
    if czynniki.count(czynnik)>1:
        print czynnik, '^', czynniki.count(czynnik), ' *',
        lastvalue = czynnik
    else:
        print czynnik, ' *',

如果要跳过循环中的某个项,而不是筛选要遍历的集合,则应该使用continue关键字。你知道吗

相关问题 更多 >

    热门问题