2013-08-26 25 views
9

Próbuję filtrować listę, chcę wyodrębnić z listy A (jest listą list), elementy, które pasują do klucza indeks 0, z inną listą B co ma serie wartościPython: lista filtrów listy z inną listą

jak ten

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) 

powinien zwrócić:

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

Jak mogę to zrobić? Dzięki!

+1

Twoje rozwiązanie zadziała, jeśli naprawię konstruktorów dla list. (Podpowiedź: użyj '[5,8]' zamiast 'list (5,8)') – Kevin

Odpowiedz

17

Użyj listowych:

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

celu zwiększenia wydajności konwersji list_b do zestawu pierwszej kolejności.

Jako że @kevin zanotował w komentarzach coś takiego jak list(5,8) (chyba że nie jest to pseudo-kod) jest nieprawidłowe, a otrzymasz komunikat o błędzie.

list() akceptuje tylko jeden element i że element powinien być iterable/iterator

+1

użycie zestawu (duża poprawa wydajności) – debzsud

1

Jesteś rzeczywiście bardzo blisko. Po prostu wykonaj to:

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

Twój komentarz dotyczący wykonania funkcji wcześniej jest błędny: 'filter (lambda list_a:. .., list_a) 'zrobiłoby dokładnie to samo, ponieważ wyrażenie' lambda' jest oceniane do wartości funkcji przed przekazaniem do 'filtru'. – Dougal

+0

@Dougal - Dziękuję. Zrobiłem to, ponieważ jakiś czas temu ktoś mnie dopadł, mówiąc, że za każdym razem ponownie tworzył 'lambda'. Pomyślałem, że to zabrzmiało źle, ale założyłem, że on wie więcej niż ja i tak poszło z jego radą. Pokazuje, co otrzymujesz, aby nie sprawdzać informacji dwukrotnie ... – iCodez

Powiązane problemy