2017-10-14 180 views
2

我有一個文件名(位置)的列表,我想要做的是我想從列表位置中刪除每個元素。從列表中刪除一些滿足條件的元素

條件:如果文件名以排除列表中的任何字符串開頭,則不要打印文件名。

locations = ['/data/mybackup/data/fil1', 
      '/data/mybackup/data/fil2', 
      '/data/mybackup/data/fil3', 
      '/data/mybackup/song/fil1', 
      '/data/mybackup/song/fil2', 
      '/data/mybackup/song/fil3', 
      '/data/archive/song/fil1', 
      '/data/archive/song/fil2', 
      '/data/archive/song/fil3', 
      '/data/archive/data/fil1', 
      '/local/archive/data/fil2', 
      '/local/archive/data/fil3', 
      '/ebboks/wordpress/fil1', 
      '/ebooks/wordpress/fil2', 
      '/ebooks/wordpress/fil3'] 

excludes = [ '/data/archive/', '/data' , '/ebooks/' ] 

for location in locations: 
    for exclude in excludes: 
    if not location.startswith(exclude): 
     print(location) 
    break  

結果:

/data/mybackup/data/fil1 
/data/mybackup/data/fil2 
/data/mybackup/data/fil3 
/data/mybackup/song/fil1 
/data/mybackup/song/fil2 
/data/mybackup/song/fil3 
/local/archive/data/fil2 
/local/archive/data/fil3 
/ebboks/wordpress/fil1 
/ebooks/wordpress/fil2 
/ebooks/wordpress/fil3  

我的結果還是有文件名以 '/數據'

什麼是錯我的代碼?

+1

'str.startswith'需要一個元組...如果你使'excludes'一個元組,而不是一個列表,你可以做'如果不是location.startswith(不包括)'一氣呵成,而不必擔心訂購/或重疊的子循環 –

+0

我想,這真的只是一個邏輯上的錯誤,而不是一個蟒蛇問題。 'excludes'內的內部循環將始終僅針對'excludes [0]'和'break'進行測試。 –

回答

3

str.startswith接受的參數覈對,所以你避免額外的循環來檢查和關注tuple約排序比較,所以你可以使用:

exc = tuple(excludes) 
# Or start with: excludes = ('/data/archive/', '/data' , '/ebooks/') instead 
for location in locations: 
    if not location.startswith(exc): 
     print(location) 

它給你:

/local/archive/data/fil2 
/local/archive/data/fil3 
/ebboks/wordpress/fil1 
+0

感謝你的努力來解決這個問題。你的解決方案確實很好。 –

1

因爲您首先檢查/data/archive/;它讓所有不以/data/archive/開頭的條目基本上跳過對/data的檢查。

你可以這樣做:

>>> excludes = tuple(excludes) 
>>> filter(lambda x: not x.startswith(excludes), locations) 
['/local/archive/data/fil2', '/local/archive/data/fil3', '/ebboks/wordpress/fil1'] 
1

您有打印位置之前檢查所有排除。

嘗試修改此:

for location in locations: 
    for exclude in excludes: 
    if not location.startswith(exclude): 
     print(location) 
    break 

要:

def valid(location): 
    for exclude in excludes: 
    if location.startswith(exclude): 
     return False 
    return True 

for location in locations: 
    if valid(location): 
    print(location) 
1

對於location是,比方說,"/data/mybackup/data/fil1"exclude"/data/archive",該location變量不"/data/archive"啓動。

由於您的excludes列表中有"/data"值,因此您無需再輸入以"/data"開頭的其他路徑。所以如果你定義了excludes = ["/data", "/ebooks"]就沒有問題了。

4

條件:做打印的文件名,如果它在 琴絃的任何的排除列表啓動。

隨着all()功能:

for location in locations: 
    if all(not location.startswith(e) for e in excludes): 
     print(location) 

輸出:

/local/archive/data/fil2 
/local/archive/data/fil3 
/ebboks/wordpress/fil1 
+0

@FujiClado,歡迎您 – RomanPerekhrest

0

嘗試列表解析:

>>> [location for location in locations \ 
if not location.startswith(tuple(excludes))] 

輸出:

['/local/archive/data/fil2', '/local/archive/data/fil3', '/ebboks/wordpress/fil1'] 

filter與lambda表達式,如果你喜歡函數式編程中@mshsayem

的答案
相關問題