2013-08-26 14 views
9

sto provando a filtrare una lista, voglio estrarre da una lista A (è una lista di liste), gli elementi che corrispondono alla chiave indice 0, con un'altra lista B ciò che ha una serie di valoriPython: filtra la lista della lista con un'altra lista

come questo

list_a = list(
    list(1, ...), 
    list(5, ...), 
    list(8, ...), 
    list(14, ...) 
) 

list_b = list(5, 8) 

return filter(lambda list_a: list_a[0] in list_b, list_a) 

dovrebbe restituire:

list(
    list(5, ...), 
    list(8, ...) 
) 

Come posso fare questo? Grazie!

+1

La soluzione funziona per me se risolvo i costruttori per gli elenchi. (Suggerimento: usa '[5,8]' invece di 'list (5,8)') – Kevin

risposta

17

utilizzare un elenco di comprensione:

result = [x for x in list_a if x[0] in list_b] 

Per migliorare le prestazioni di convertire list_b a un set prima.

Come @kevin ha notato nei commenti qualcosa come list(5,8) (a meno che non sia uno pseudo-codice) non è valido e si otterrà un errore.

list() accetta solo un elemento e che voce deve essere iterabile/iteratore

+1

uso del set (grande miglioramento delle prestazioni) – debzsud

1

Vi sono in realtà molto vicino. Basta fare questo:

list_a = list(
    list(1, ...), 
    list(5, ...), 
    list(8, ...), 
    list(14, ...) 
) 

# Fix the syntax here 
list_b = [5, 8] 

return filter(lambda list_a: list_a[0] in list_b, list_a) 
+0

Il tuo commento su come rendere la funzione in anticipo è sbagliato: 'filter (lambda list_a:. .., list_a) 'farebbe esattamente la stessa cosa, poiché l'istruzione' lambda' viene valutata fino ad un valore di funzione prima di essere passata a 'filter'. – Dougal

+0

@Dougal - Grazie. L'ho fatto perché, qualche tempo fa, qualcuno mi ha accusato di aver ricreato il 'lambda' ogni volta. Ho pensato che suonasse male, ma ho pensato che ne sapesse più di me e così è andato con il suo consiglio. Mostra ciò che ottieni per informazioni che non sono state ricontrollate ... – iCodez