2015-02-22 29 views
6

alt dize I en pythonic yolu nedir merak eğer.Kaldır dize listesi

list_dirs = ('C:\\foo\\bar\\hello.txt', 'C:\\bar\\foo\\.world.txt', 'C:\\foo\\bar\\yellow.txt') 

unwanted_files = ('hello.txt', 'yellow.txt) 

İstenilen çıktı:

list_dirs = (C:\\bar\\foo\.world.txt') 

Böyle this gibi benzer soruları uygulamaya çalıştık, ama yine de kaldırılmasını yapma mücadele ve bir listeye bu özel uygulama uzatmak ediyorum.

Şimdiye kadar bu yapmış:

for i in arange(0, len(list_dirs)): 
    if 'hello.txt' in list_dirs[i]: 
     list_dirs.remove(list_dirs[i]) 

Bu işler ama muhtemelen daha temiz bir yol değil ve ben hello.txt veya yellow.txt I kaldırmak isterseniz daha önemlisi, bir liste desteklemez Bir veya kullanmak zorunda kalacaktı. Teşekkürler. Ayrıca ya da ithal etmek sakıncası yoksa lambda'da

print filter(lambda x: x.split('\\')[-1] not in unwanted_files, list_dirs) 
#['C:\\bar\\foo\\.world.txt'] 

bir filtre işlevi kullanabilirsiniz

>>> [l.split('\\')[-1] for l in list_dirs] 
['hello.txt', '.world.txt', 'yellow.txt'] 
+0

@PM 2Ring gibi görünecektir bir liste anlama olarak dize)

print filter(lambda x: os.path.basename(x) not in unwanted_files, list_dirs) 

tting. arange – dudas

+0

aralığına benzer. Yinelediğiniz bir koleksiyonu değiştirmek güvenli değildir. –

cevap

2

os (imo bu daha temiz spli ben numpy kullanıyordum Evet bu

[l for l in list_dirs if os.path.basename(l) not in unwanted_files] 
+0

Bence işe yaradı. Teşekkürler – dudas

+0

Şu an biraz daha yakına bakıyorum. Bu uygulama, istenmeyen dosyaların veya yalnızca bir alt dizinin doğru dosya adını gerektiriyor mu? Ben test ettim ve bu doğru dosya adı gerekli – dudas

+0

@dudas tüm doğru dosya adı gerekli gibi görünüyor. – styvane

1

dosya adını almak için list comprehensions

>>> [l for l in list_dirs if l.split('\\')[-1] not in unwanted_files] 
['C:\\bar\\foo\\.world.txt'] 

kullanın split kullanma