2014-01-11 4 views
0

У меня есть отсортированный список значений, которые нужно фильтровать так, чтобы возвращаемые значения не совпадали с значением слева.Python: фильтрация списка с использованием подсчета списков

Например, mylist = [1,2,2,3,3,3,3,6,7,9,9,11] вернется [1,2,3,6,7,9,11] ,

Я выполнил эту задачу, используя for и if, но задаюсь вопросом, нет ли более элегантного решения с использованием списков.

Спасибо!

ответ

0

В списке отсортировано, то есть по определению то же самое, что и list(set(mylist)), что просто отменяет ваш список.

Но, код игры в гольф немного, так как вы попросили список-Comp, есть очаровательная:

seen = set() 

[x for x in mylist if x not in seen and not seen.add(x)] 
Out[3]: [1, 2, 3, 6, 7, 9, 11] 

Или:

from itertools import zip_longest 

[tup[0] for tup in zip_longest(mylist,mylist[1:]) if len(set(tup)) == 2] 
Out[11]: [1, 2, 3, 6, 7, 9, 11] 

Последний из которых работает с требованием о не -сортированные списки.

Как вы можете видеть, обе они менее читаемы, чем list(set(mylist)), что должно быть предпочтительным, если вы знаете, что ваши списки входных данных будут всегда отсортированы.

+0

Спасибо @roippi. Можете ли вы объяснить механику решения 1 немного? Имея небольшую проблему, понимая, как «and not seen.add (x)» фильтрует список. – user2957824

+0

@ пользователь2957824 это код гольф-иш часть. 'set.add' ничего не возвращает, так что часть эквивалентна', а не None', которая всегда верна. Он также добавляет 'x' в' set', поэтому второй раз вокруг 'x in seen' является' True', и он отфильтровывается. – roippi

3

Я не думаю, что есть способ сделать это с список понимания, но лучший способ сделать это будет:

mylist=[1,2,2,3,3,3,3,6,7,9,9,11] 
uniqueList = list(set(mylist)) 
+0

Это имеет смысл, и это намного проще! – user2957824

1

Вы можете попробовать что-то вроде этого:

>>> m=set(mylist) 
>>> m 
set([1, 2, 3, 6, 7, 9, 11]) 
Смежные вопросы