2012-09-08 26 views
0

我是一名初學者程序員,我決定編寫一個簡單的程序來獲取數字中的主要因素,然後將其打印出來,但是我在打印最終結果時遇到了麻煩。這裏是代碼:爲什麼for循環迭代(看似)空列表?

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」,就好像過濾功能完全沒有影響一樣。錯誤在哪裏?

回答

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, ' *', 
+0

啊,我明白了。你的代碼工作,謝謝! –

0

如果您想跳過循環中的某個項目而不是過濾您嘗試瀏覽的集合,則應該使用continue關鍵字。

+0

你是什麼意思?我使用過濾函數從列表中刪除給定值的所有實例,因爲它們已經被打印(例如,如果列表中有三個五我想讓程序打印「5^3」,然後將所有三個從 –

+0

您不能更改您正在操作的集合,如果您對重複項沒有興趣,在開始打印之前最好將其刪除,您可以通過將列表轉換爲集來實現此目的。 – MichaelT

+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)