2015-05-16 42 views
0

我能捕捉到第一個實例,但試圖讓無論是數量還是隻是在返回sets如何在字符串上使用filter()並獲取多個單詞出現?

例如複製,這裏是我的代碼簡化,

word_list = ['Geico','Mike'] 
a_string = "what day is it, Mike Mike Mike" 
sets = filter(lambda x:x in a_string,word_list) 

...我得到['Mike']但想獲得['Mike','Mike','Mike'];只是有些方法可以更好地理解如何在過濾器內迭代。我可能不需要每個「邁克」爲我的項目,但瞭解這個將幫助我包圍使用濾波器()lambda;所以改進這些代碼對我來說比對它的新方法更重要。

+0

你不能指望拿到三「邁克」 S如果你從一些含有它只有一次過濾。 –

+1

你正在做相反的 打印過濾器(lambda x:x在word_list,李) 過濾器(針,乾草堆) – Ajay

+0

@StefanPochmann我不知道過濾器()如此好,但有很多事情可以幹DRY處理。 Ajay最終在他的回答中解釋得很好。 – Shane

回答

2

Understaning篩選:

您otherway周圍搜索。 你應該這樣做filter(needle,haystack) 但你正在做filter(haystack,needle)

>>> names = ['Anna', 'Grant', 'Bob', 'David', 'Carrie', 'Barbara', 'Zach'] 
>>> b_names = filter(lambda s: s.startswith('B'), names) 
>>> print b_names 
#Output 
['Bob', 'Barbara'] 

filter(function, iterable)相當於[item for item in iterable if function(item)]如果功能不無[item for item in iterable if item]如果功能無

瞭解蘭巴: lambda只是另一個詞function當你看完下面的行,由function在你的心中取代lambda

>>> f = lambda x: x + 10 
>>> f(3) 
13 

舉例:2

f = lambda x, y : x * y 

的以上功能相當於下面的功能。

def f(x, y): 
    return x * y 

lambda返回給定參數的:標誌的左邊將返回在它右邊的表達式的值的函數。 更多關於拉姆達在這個post

from collections import Counter 


word_list = ['Geico','Mike'] 
a_string = "what day is it, Mike Mike Mike" 
li=a_string.split() 
print Counter(li) 
print [i for i in li if i in word_list] 

Output: 
Counter({'Mike': 3, 'what': 1, 'it,': 1, 'day': 1, 'is': 1}) 
['Mike', 'Mike', 'Mike'] 
+0

謝謝阿賈伊,這工作,但我看着如何做到這一點,使用'過濾器()'與'lambda'來更好地理解是否有可能。如果沒有人能夠想出我要求的方式,那麼我可能會重新考慮你的答案。 – Shane

+1

@Shane我修改過 – Ajay

+0

,太棒了,謝謝! – Shane

1

過濾器是相當直觀: 你給它某種迭代和約束(您拉姆達功能)。然後它會遍歷每個項目,只有保留它才能滿足約束條件。

所以你的情況,你要重複你的句子的單詞(因此把它分解第一),只有留住他們,如果他們在你的單詞列表:

word_list = ['Geico','Mike'] 
a_string = "what day is it, Mike Mike Mike" 
sets = filter(lambda x: x in word_list, a_string.split()) 
print(list(sets)) 
0

我想你想過濾由「」 按每個單詞是否在word_list中分割的a_string列表。

我的回答:

sets = filter(lambda x:x in word_list, a_string.split()) 

或:

sets = [x for x in a_string.split() if x in word_list] 
相關問題