2017-06-06 3 views
-2

Ich habe die folgende Funktion und ich versuche, eine Liste mit den "Tweet-Nummern" von Tweets von DanClark gemacht. Ich spalte die Saiten und versuche, die Filterfunktion zu benutzen, um sie zu erzeugen. Ich versuche eine explizite Rekursion zu vermeiden. Ich erhalte die folgende Fehlermeldung „‚str‘Objekt ist nicht aufrufbar“, wenn ich versuche zu laufen „search_tweets (tweets‚DanClark‘)“Ich versuche, die Filterfunktion für Strings zu verwenden

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

Warum würden Sie sogar Filter verwenden? –

+0

wurde mir gesagt, keine explizite Rekursion zu verwenden. Also habe ich es mit Filter versucht. –

+0

warum sogar Rekursion verwenden, gibt es keine Notwendigkeit für Rekursion –

Antwort

0

Wenn Sie es wirklich ohne explizite Schleifen zu tun bestehen, Listenkomprehensionen oder irgendetwas dieser Art, Sie können jedes Element Ihrer Liste einer Suchfunktion zuordnen und dann leere Ergebnisse herausfiltern. Etwas wie:

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))) 

Dann, wenn Sie es Ihre Daten zur Verfügung stellen und sie mit dem beabsichtigten Autor nennen, werden Sie das erwartete Ergebnis erhalten:

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'] 

Btw. (Meinungszeit) Dies ist eine knochige Art, es zu tun, aber was auch immer ... Ich habe gehört, dass Idiotenlehrer und Interviewer noch mehr lächerliche Dinge verlangen.

0

Ich glaube, Filter das erste Argument erwartet, während Sie eine Funktion zu sein geben Sie den Rückgabewert Ihres Aufrufs an Trennzeichen.

Python Doc:

anzumerken, dass Filter (Funktion, iterable) äquivalent zu dem Generator Ausdruck (Punkt für Punkt in iterable, wenn die Funktion (item))

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

Gegeben:

>>> 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] 

Sie können filter verwenden, um die Liste tweets für Tweets nach dem ersten Element wie folgt zu durchsuchen:

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

Oder das zweite Element:

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

Dann, wenn Sie nur wollen, um die Zahlen zu Dan Tweets entsprechen:

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