Ваш тестовый список:
In [81]: alist = ['black', 'blue', 'green', 'purple', 'yellow', 'red']
длины строк:
In [82]: [len(s) for s in alist]
Out[82]: [5, 4, 5, 6, 6, 3]
строк 4 или менее - найдено два:
In [83]: [len(s)<=4 for s in alist]
Out[83]: [False, True, False, False, False, True]
строк 8 или более - none:
In [85]: [len(s)>=8 for s in alist]
Out[85]: [False, False, False, False, False, False]
оба условия одновременно - все еще none
In [86]: [len(s)<=4 and len(s)>=8 for s in alist]
Out[86]: [False, False, False, False, False, False]
In [87]: q = filter(lambda x: len(x) <= 4 and len(x) >= 8, alist)
In [88]: list(q)
Out[88]: []
filter
пропускает элементы, которые удовлетворяют условию, т. е. где Out [86] равно True. Это работает - с учетом теста.
Но вы говорите, что хотите опустить длины от 4 до 8 включительно:
Измените тест на: В [92]: [ len (s)> = 4 и len (s) <= 8 для s в alist] <br>Out [92]: [True, True, True, True, True, False]
отрицать это:
In [93]: [not(len(s)>=4 and len(s)<=8) for s in alist]
Out[93]: [False, False, False, False, False, True]
и альтернатива:
In [94]: [len(s)<4 or len(s)>8 for s in alist]
Out[94]: [False, False, False, False, False, True]
In [95]: list(filter(lambda s: len(s)<4 or len(s)>8, alist))
Out[95]: ['red']
filter
- это не filter-out.
Мне нравится ясность понимания списка как:
In [96]: [s for s in alist if len(s)<4 or len(s)>8]
Out[96]: ['red']