2015-02-22 28 views
6

podciąg Zastanawiałem się, co jest najbardziej pythonic sposobem:zdjąć łańcuch z listy, jeśli z listy

Mając listę ciągów oraz listę podciągów usuwania elementów listy znaków, który zawiera żadnej z listy podciągu.

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

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

Pożądany wyjściowa:

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

starałem się wdrożyć podobne pytania, takie jak this, ale ja wciąż zmaga się co usuwanie i rozszerzenie tej konkretnej implementacji do listy.

tej pory zrobiłem tak:

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

To działa, ale prawdopodobnie nie jest bardziej przejrzysty sposób, a co ważniejsze nie obsługuje listę, jeśli chcę usunąć hello.txt lub yellow.txt I musiałby użyć a lub. Dzięki.

+0

@PM firmy 2Ring Tak używałem numpy. arange jest podobne do zakresu – dudas

+0

Nie jest bezpieczna modyfikacja kolekcji, która jest iterowana. –

Odpowiedz

2

Korzystanie list comprehensions

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

Korzystając split uzyskać nazwa_pliku

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

Myślę, że zadziałało. Dzięki – dudas

+0

Teraz trochę bliżej. Czy ta implementacja wymagała poprawnej nazwy pliku niechcianych plików lub tylko podłańcucha? Przetestowałem i wydaje mi się, że wymagało to podania poprawnej nazwy pliku – dudas

+0

@dudas to wymagało poprawnej nazwy pliku. – styvane

1

również może korzystać z funkcji filtrowania z lambda

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

lub jeśli nie masz nic do importu os (imo to jest czystsze niż spli Wp ro ciąg)

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

na liście zrozumieniem to wyglądać tak

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