2010-10-26 73 views
2

我是新來的Python,我努力理解這個簡單程序的輸出:爲什麼這個python列表的某些元素被忽略?

list = os.listdir(os.getcwd()) 
print(list) 
print() 
for element in list: 
    print(element) 
    if 'txt' not in element: list.remove(element) 

,給了我這樣的輸出:

['examples_list.txt', 'generate_patterns.py', 'lehoczky_example_3.txt', 'patterns', 'test.py', 'test2.py'] 

examples_list.txt 
generate_patterns.py 
patterns 
test2.py 

爲什麼某些元素(如'lehoczky_example_3.txt'),被「for」循環忽略?

+0

這是經典失誤(Python)之一。 @ eumiro的答案是最好的解決方案。 – PaulMcG 2010-10-26 13:29:20

+1

迭代時,您無法修改列表。 – hughdbrown 2010-10-26 15:05:15

回答

5

嘗試列表理解。這將保留您的清單files並創建一個新清單noTxtFiles而不觸及files

files = os.listdir(os.getcwd()) 
noTxtFiles = [ element for element in files if 'txt' not in element ] 

並且不要使用保留字list作爲變量名。

+0

感謝您的建議!這實際上是一個非常優雅的方式來做到這一點 – 2010-10-26 14:29:32

10

在進行循環時,不能從列表中刪除元素。嘗試並遍歷列表的副本,或創建一個僅包含要保留的元素的新副本。

又見Python strange behavior in for loop or lists

+1

從技術上講,您可以在循環時從列表中移除元素,但您不會得到您預期的結果。 – WildCrustacean 2010-10-26 12:53:06

+0

@bde - 正確。在其他一些編程語言中,如果有'for(i = 10; i> = 0; i - )'循環,則這個反向迭代用於安全地移除單個元素。 – eumiro 2010-10-26 12:55:38

+0

@eumiro - 在刪除元素時反向遍歷列表在Python中也是有效的。但是真正的Pythonic解決方案是從你的答案中發佈一個新的列表,如你在答案中發佈的那樣。 – PaulMcG 2010-10-26 13:28:14