2017-06-06 27 views
-2

我有以下功能,我正在嘗試製作一個包含由DanClark完成的推文的「推文數字」的列表。我正在分割字符串並嘗試使用過濾器函數來生成它。我試圖避免顯式遞歸。我不斷收到以下錯誤「‘海峽’對象不是可調用」當我嘗試運行「search_tweets(鳴叫,‘DanClark’)」試圖在字符串上使用過濾器函數

tweet1 = "#1::@DanClark::The party was amazing" 
tweet19 = "#19::@NatalyS::Avoid 401 Toronto area at this time" 
tweet50 = "#50::@CBCNews::How Canadian captain gave her team a speech" 
tweet14 = "#14::@DanClark::The food was good" 
tweet15 = "#15::@DaveLin::Lucky you DanClark" 
tweets = [tweet1, tweet19, tweet50, tweet14, tweet15] 

def separator(tweets, item1, item2, tweeter): 

part1 = (tweets[item1].split('::')) 
part2 = part1[item2] 
part3 = part2[1:] 

    if part3 == tweeter: 
     return (part1[0])[1:] 
    else: 
     return [] 

def search_tweets(tweets, tweeter): 
    return list(filter((separator(tweets, 0, 1, tweeter)), tweets)) 
+0

爲什麼你甚至會使用過濾器? –

+0

我被告知不要使用顯式遞歸。所以我試着用過濾器來做。 –

+0

爲什麼即使使用遞歸,也不需要遞歸 –

回答

0

如果你真的堅持做到這一點沒有明確的循環,列表內涵或者這種類型的任何東西,您可以將列表中的每個元素映射到搜索函數,然後篩選出空的結果。喜歡的東西:

def search_tweets(tweets, author): 

    def search_tweet(tweet): 
     tweet_fields = tweet.split('::', 2) 
     return tweet_fields[0][1:] if tweet_fields[1][1:] == author else None 

    return list(filter(None, map(search_tweet, tweets))) 

然後,如果你提供它的數據和預期的作者調用它,你會得到預期的結果:

tweet1 = "#1::@DanClark::The party was amazing" 
tweet19 = "#19::@NatalyS::Avoid 401 Toronto area at this time" 
tweet50 = "#50::@CBCNews::How Canadian captain gave her team a speech" 
tweet14 = "#14::@DanClark::The food was good" 
tweet15 = "#15::@DaveLin::Lucky you DanClark" 
tweets = [tweet1, tweet19, tweet50, tweet14, tweet15] 

print(search_tweets(tweets, "DanClark")) 
# prints: ['1', '14'] 

順便說一句。 (意見時間)這是一個以頭把交椅的方式來做到這一點,但無論如何......我聽說白癡教師和麪試官要求更荒謬的事情。

0

我相信濾料的第一個參數是,而你的函數正在給你的分隔符呼叫的返回值。

從python文檔:

注意,過濾器(功能,可迭代)(如果函數(項目)項爲項目在迭代)

0
tweet1 = "#1::@DanClark::The party was amazing" 
tweet19 = "#19::@NatalyS::Avoid 401 Toronto area at this time" 
tweet50 = "#50::@CBCNews::How Canadian captain gave her team a speech" 
tweet14 = "#14::@DanClark::The food was good" 
tweet15 = "#15::@DaveLin::Lucky you DanClark" 
tweets = [tweet1, tweet19, tweet50, tweet14, tweet15] 

def numbers_of_tweets_done_by(who): 
    r_list = [] 
    for tweet in tweets: 
     t_info = tweet.split('::') 
     if t_info[1] == who: 
      r_list.append(int(t_info[0][1:])) 
    return r_list 

if __name__ == '__main__': 
    print(numbers_of_tweets_done_by('@DanClark')) 

#Prints [1,14] 
0

鑑於相當於發電機表達式:

>>> tweet1 = "#1::@DanClark::The party was amazing" 
>>> tweet19 = "#19::@NatalyS::Avoid 401 Toronto area at this time" 
>>> tweet50 = "#50::@CBCNews::How Canadian captain gave her team a speech" 
>>> tweet14 = "#14::@DanClark::The food was good" 
>>> tweet15 = "#15::@DaveLin::Lucky you DanClark" 
>>> tweets = [tweet1, tweet19, tweet50, tweet14, tweet15] 

可以使用filter第一要搜索的元素鳴叫名單tweets像這樣:

>>> tweeter = '#50' 
>>> list(filter(lambda s: s.partition('::')[0]==tweeter, tweets)) 
['#50::@CBCNews::How Canadian captain gave her team a speech'] 

或第二要素:

>>> tweeter = '@DanClark' 
>>> list(filter(lambda s: s.split('::')[1]==tweeter, tweets)) 
['#1::@DanClark::The party was amazing', '#14::@DanClark::The food was good'] 

然後,如果你只是想與丹的鳴叫的數字:

>>> [e.partition('::')[0] for e in filter(lambda s: s.split('::')[1]==tweeter, tweets)] 
['#1', '#14']