2015-02-22 6 views
6

sottostringa mi chiedevo qual è il modo più divinatorio per:Rimuovere stringa dalla lista se dalla lista

Avere una lista di stringhe e una lista di sottostringhe rimuovere gli elementi della lista stringa che contiene qualsiasi della lista stringa.

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

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

output desiderato:

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

ho cercato di attuare domande simili come this, ma sto ancora lottando rendendo la rimozione ed estendere quel particolare implementazione di una lista.

Finora ho fatto questo:

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

Questo funziona, ma probabilmente non è il modo più pulito e più importante, non supporta una lista, se voglio rimuovere ciao.txt o io yellow.txt dovrebbe usare un o. Grazie.

+0

@PM 2Ring Sì stavo usando NumPy. arange è simile all'intervallo – dudas

+0

Non è sicuro modificare una raccolta su cui si sta iterando. –

risposta

2

Utilizzando list comprehensions

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

Usa split per ottenere il nome del file

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

Penso che abbia funzionato. Grazie – dudas

+0

Guardando un po 'più vicino in questo momento. Questa implementazione richiede il nome file corretto di file indesiderati o solo una sottostringa? Ho provato e sembra che richiesto tutto il nome corretto del file – dudas

+0

@dudas questo richiedesse il nome file corretto. – styvane

1

si potrebbe anche usare una funzione di filtro con lambda

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

o se non ti dispiace per l'importazione os (questo è più pulito quindi spli talla zio la stringa)

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

In un elenco di comprensione sarebbe simile a questa

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