Python лямбда: строки между длинами - PullRequest
0 голосов
/ 06 марта 2020

Учитывая список строк, выведите его после пропуска слов длиной от 4 до 8 (включительно).

Я пытался использовать этот код:

 Question = filter(lambda x: len(x) <= 4 and len(x) >= 8, strs)
 print (list(Question))

, но он вернул следующее:

 [] 

Есть идеи, как это сделать без создания двух разных методов фильтрации?

Ответы [ 3 ]

0 голосов
/ 06 марта 2020

Ваш тестовый список:

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']
0 голосов
/ 06 марта 2020

Согласно постановке задачи

Given a list of Strings, print the list after omitting any words with lengths between 4 and 8 (inclusive)

Условие или предикат len(x) <= 4 and len(x) >= 8 никогда не будет истинным ни при каких условиях. Либо len(x) <= 4 может быть истинным, либо len(x) >= 8.

logi c должно быть чем-то вроде

In [1]: colors = [ 
    ...: 'White', 
    ...: 'Yellow', 
    ...: 'Blue', 
    ...: 'Red', 
    ...: 'Green', 
    ...: 'Black', 
    ...: 'Charcoal', 
    ...: 'Aquamarine', 
    ...: ] 
    ...:  
    ...:                                                                                                                         

In [2]: result_colors = filter(lambda color: not (len(color) >= 4 and len(color) <= 8), colors)                                 

In [3]: list(result_colors)                                                                                                     
Out[3]: ['Red', 'Aquamarine']

При использовании условия Де Моргана l aws not (len(color) >= 4 and len(color) <= 8) can переписать как len(color) < 4 or len(color) > 8.

0 голосов
/ 06 марта 2020

filter сохранит элементы в соответствии с предикатом, а не удалит их. Если вы хотите удалить элементы длиной от 4 до 8, вам следует отфильтровать обратное условие:

>>> strs = ['black', 'blue', 'green', 'purple', 'yellow', 'test_samples', 'sample_data']
>>> Question = filter(lambda x: len(x)> 8 or len(x) < 4, strs)
>>> list(Question)
['test_samples', 'sample_data']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...