2016-04-26 3 views
1

У меня есть список слов. Я хочу отфильтровать слова, которые не имеют минимальной длины. Я пробовал фильтр, но показывал некоторую ошибку. Мой кодПередача двух аргументов функции при использовании фильтра

def words_to_integer(x,y): 
      return len(x)> y 


print("enter the list of words : ") 
listofwords = [ str(x) for x in input().split()] #list of words 
minimumlength = print("enter the length ")   
z = list(filter(words_to_integer,(listofwords,minimumlength))) 

print("words with length greater than ",minimumlength ,"are" ,z) 

ошибка

z = list(filter(words_to_integer,(listofwords,minimumlength))) 
TypeError: words_to_integer() missing 1 required positional argument: 'y' 

ответ

2

Вы должны смотреть на functools.partial:

from functools import partial 

z = filter(partial(words_to_integer, y=minimumlength), listofwords) 

partial(words_to_integer, y=minimumlength) та же функция, как words_to_integer, но с аргументом y фиксированы на minimumlength.

0

Вы не можете этого сделать. Вам нужно передать функцию, которая уже знает о минимальной длине.

Один простой способ сделать это было бы использовать лямбда вместо вашей автономной функции:

filter(lambda x: len(x) > minimumlength, listofwords) 
0

Когда вы набираете этот

list(filter(words_to_integer,(listofwords,minimumlength))) 

питон пытается сделать что-то вроде этого:

z = [] 
if words_to_integer(listofwords): 
    z.append(listofwords) 
if words_to_integer(minimumlength): 
    z.append(minimumlength) 

, который потерпит неудачу, потому что words_to_integer принимает 2 аргумента, но только один из них был giv эн.

Вы, вероятно, хотите что-то вроде этого:

z = [] 
for word in listofwords: 
    if words_to_integer(word): 
     z.append(word) 

, который выглядит, как это с filter:

z = list(filter(lambda word: words_to_integer(word, minimumlength), listofwords)) 

или использовать partial как в другой ответ.

Смежные вопросы