Попытка понять «лямбду» и «карту» в этом сценарии - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь понять функции лямбды и отображения в python, особенно в отношении приведенного ниже кода, которому я следовал, используя tweeps API. Я погуглил лямбду и карту, но изо всех сил пытаюсь понять это в контексте этого сценария. Как я понимаю, лямбда передает аргумент и выражение, становясь тем самым укороченной функцией? Не могли бы вы взглянуть на приведенный ниже код и указать, что карта и лямбда делают в каждой строке здесь?

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

Я прекрасно следовал инструкции, но это бросило меня, так как я никогда не видел карту или лямбда раньше. Я понимаю, что мы создаем фрейм данных в pandas Я просто не уверен, как это происходит?

Спасибо !!

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Простой способ понять лямбду состоит в том, что она принимает аргумент перед :, что бы после : не возвращалось. Например, в приведенном выше коде:

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, который просто применяет данную функцию к iterable (list, tuple, et c.) И возвращает iterable

Примечание: Итерация - это то, к чему вы можете обратиться за l oop

Итак, если мы сделаем небольшую функцию для вашего лямбда-выражения lambda tweet: tweet['text'] if 'extended_tweet' not in tweet else tweet ['extended_tweet']['full_text'], она будет выглядеть следующим образом:

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

Давайте применим это к нашей карте:

map(foo, tweets_data)

Итак, здесь функция foo() применяется к каждому элементу tweets_data

И функция list принимает Возвращаемое значение map по одному и преобразует их в список

Надеюсь, вы найдете объяснение полезным

0 голосов
/ 15 апреля 2020

Синтаксически функция карты выглядит следующим образом:

map(callable, <collection>)

Проще говоря, она перебирает коллекцию и для каждого элемента выполняет вызываемый элемент и заменяет элемент возвращаемым значением вызываемого элемента. в списке. Ну, технически это не изменяет список и не создает новый список, но вы поняли идею. Вы передаете iterable, а map возвращает новый iterable, где каждый элемент преобразуется с использованием callable.

Теперь lambda - это сокращение для создания безымянной функции.

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 к обычной функции:

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

Итак, ваш код делает:

  • Итерирует по tweets_data (iterable).
  • Для каждого tweet в этих tweets_data он вызывает callable (lambda), который принимает один аргумент.
  • И принимает возвращаемое значение и возвращает его как часть генератора.

The * Функция 1040 * преобразует generator в list, заставляя все tweets преобразовываться одновременно.

Теперь вы можете попытаться понять другие лямбды. Вероятно, go также из документации, которая довольно сложна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...