2015-12-09 5 views
3

Как фильтровать список списков на основе другого списка/набора в python. Для простого списка этого можно сделать:Фильтровать список списков на Python другим списком

mylist = [1,2,3,4,5,3,5,2,3,2,7,5,3] 
[x for x in mylist if x in {3,5}] 

Но как сделать это для списка списков наиболее эффективно:

mylistoflists = [[], [5, 1, 6], [5, 1, 6, 2, 7], [5, 1, 6, 2, 7, 4, 8], [5, 1, 11, 10], [5, 1, 4, 11, 10, 12]] 
myvalues = set([4,10]) 

Результаты должны еще быть списком списков, таких как следующие:

[[], [], [], [4], [10], [4, 10]] 
+0

Обратите внимание, что вы можете по буквам 'установить ([а, Ь, с]) 'как заданный литерал' {a, b, c} ', отражающий нормальную математическую нотацию для множеств. –

ответ

5

В принципе, та же мысль:

>>> mylistoflists = [[], [5, 1, 6], [5, 1, 6, 2, 7], [5, 1, 6, 2, 7, 4, 8], [5, 1, 11, 10], [5, 1, 4, 11, 10, 12]] 
>>> myvalues = {4, 10} 
>>> [[x for x in L if x in myvalues] for L in mylistoflists] 
[[], [], [], [4], [10], [4, 10]] 

Если myvalues является константой, вы можете заменить его на набор литералов в понимании списка для лучшей производительности.

3

Если Вы не заботитесь о порядке пересечения как более вещий образом, вы можете использовать set.intersection в списке понимание:

>>> new = [list(myvalues.intersection(i)) for i in mylistoflists] 
>>> new 
[[], [], [], [4], [10], [10, 4]]