[英]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>)
簡而言之,它遍歷集合,並在每個項目上執行可調用對象,並將列表中的可調用對象的返回值替換為該項目。 好吧,從技術上講,它不會修改列表,也不會創建新列表,但你明白了。 您傳遞一個iterable
, map
返回一個新的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)
。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.