[英]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.