簡體   English   中英

試圖理解這個腳本中的 'lambda' 和 'map'

[英]Trying to understand 'lambda' and 'map' in this script

我正在嘗試了解 python 中的 lambda 和 map 函數,特別是關於我一直在使用 tweeps Z243ADB97A47CDE1871 的以下代碼我用谷歌搜索了 lambda 和 map 但我在這個腳本的上下文中很難理解它。 據我了解 Lambda 傳遞一個參數和一個表達式,從而成為縮短的 function? 您能否幫我看看下面的代碼,並指出 map 和 lambda 在這里的每一行中都在做什么?

#Reading the raw data collected from the Twitter Streaming API using Tweepy
tweets_data = []
tweets_data_path = 'output2.txt'
tweets_file = open(tweets_data_path, 'r')
for line in tweets_file:
    try:
        tweet = json.loads(line)
        tweets_data.append(tweet)
    except:
        continue

print('The total number of Tweets is:', len(tweets_data))

#Create a function to see if the tweet is a retweet
def is_RT(tweet):
    if 'retweeted_status' not in tweet:
        return False
    else:
        return True

#Create a function to see if the tweet is a reply to a tweet of another user, if so return that user.
def is_Reply_to(tweet):
    if 'in_reply_to_screen_name' not in tweet:
        return False
    else:
        return tweet['in_reply_to_screen_name']

#Convert the Tweet JSON data to pandas Dataframe, and take the desired fields from the JSON.

tweets = pd.DataFrame()
tweets['text'] = list(map(lambda tweet: tweet['text'] if 'extended_tweet' not in tweet else tweet ['extended_tweet']['full_text'], tweets_data))

tweets['Username'] = list(map(lambda tweet: tweet['user']['screen_name'], tweets_data))

tweets['Timestamp'] = list(map(lambda tweet: tweet['created_at'], tweets_data))

tweets['length'] = list(map(lambda tweet: len(tweet['text']) if 'extended_tweet' not in tweet else len(tweet['extended_tweet']['full_text']), tweets_data))

tweets['location'] = list(map(lambda tweet: tweet['user']['location'], tweets_data))

tweets['device'] = list(map(reckondevice, tweets_data))

tweets['RT'] = list(map(is_RT, tweets_data))

tweets['Reply'] = list(map(is_Reply_to, tweets_data))

我很好地遵循了指南,但這讓我感到震驚,因為我以前從未見過 map 或 lambda。 我知道我們正在 pandas 中構建一個數據框我只是不確定它是如何發生的?

謝謝!!

語法上 map function 是這樣的:

map(callable, <collection>)

簡而言之,它遍歷集合,並在每個項目上執行可調用對象,並將列表中的可調用對象的返回值替換為該項目。 好吧,從技術上講,它不會修改列表,也不會創建新列表,但你明白了。 您傳遞一個iterablemap返回一個新的iterable ,其中每個項目都使用callable進行轉換。

現在, lambda是創建未命名 function 的簡寫。

lambda x: str(x)

類似於:

def transform_to_str(x):
    return str(x)

現在,給定這段代碼:

tweets['text'] = list(map(lambda tweet: tweet['text'] if 'extended_tweet' not in tweet else tweet ['extended_tweet']['full_text'], tweets_data))

讓我們把它分開:

callable = lambda tweet: tweet['text'] if 'extended_tweet' not in tweet else tweet ['extended_tweet']['full_text']

iterable = tweets_data

tweets['text'] = list(map(callable, iterable))

讓我們將callable轉換為普通的 function:

def callable(tweet):
    return tweet['text'] if 'extended_tweet' not in tweet else tweet ['extended_tweet']['full_text']

因此,您的代碼所做的是:

  • 它遍歷tweets_data (iterable)
  • 對於該 tweets_data 中的每條tweet ,它調用callable (lambda) ,它采用單個參數。
  • 並將其作為生成器的一部分返回值並返回。

list() function 將generator轉換為list ,從而強制所有tweets立即轉換。

現在,您可以嘗試理解其他 lambda。 也可能通過文檔 go ,這是相當詳盡的。

理解 lambda 的一種簡單方法是,它在:之前需要一個參數,無論在:之后是什么,都會返回。 例如,在您上面的代碼中:

tweets['text'] = list(map(lambda tweet: tweet['text'] if 'extended_tweet' not in tweet else tweet ['extended_tweet']['full_text'], tweets_data))

lambda tweet: tweet['text']只接受dictionary tweet並返回鍵text的值

而且, map 是一個function ,它只是將給定的 function 應用於一個iterable對象(列表、元組等)並返回一個iterable

注意:可迭代是您可以申請循環的東西

So, if we make a small function for your lambda expression lambda tweet: tweet['text'] if 'extended_tweet' not in tweet else tweet ['extended_tweet']['full_text'] , it would look like:

def foo(tweet):
    if 'extended_tweet' not in tweet:
        return tweet['text']
    else:
        return tweet ['extended_tweet']['full_text']

讓我們將此應用於我們的 map:

map(foo, tweets_data)

因此,在這里,function foo()被應用於tweets_data的每個元素

list function 將map的返回值一一轉換為列表

希望你覺得解釋有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM