为什么循环迭代(貌似)空列表?

时间:2012-09-08 11:05:10

标签: 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”,就像过滤功能完全没有影响一样。错误在哪里?

3 个答案:

答案 0 :(得分:2)

问题是你在迭代它时修改列表czynniki。试试这个:

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)

答案 1 :(得分:1)

您在for中存储的列表上开始czynniki循环,您稍后会更改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, ' *',

答案 2 :(得分:0)

如果你想跳过循环中的某个项目而不是过滤你想要过去的集合,你应该使用continue关键字。