我是初学程序员,我决定编写一个简单的程序,从数字中获取素数因子然后打印它们,但是我在打印最终结果时遇到了麻烦。这是代码:
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”,就像过滤功能完全没有影响一样。错误在哪里?
答案 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关键字。