Преобразование объекта карты в значения для определенной функции с четырьмя переменными - PullRequest
0 голосов
/ 10 января 2020

Я пытаюсь распечатать объект карты (это результат карты (функции) с четырьмя переменными), но я не смог преобразовать объект карты в значения. Любая помощь или понимание было бы очень заметно. Заранее спасибо.

Лучший,

def func(x1,y1,x2,y2):
    return [(x1+x2)/2, (y1/y2)/2]

numbers = (1,2,3,4)
output = map(func, numbers)
print(output)

# converting map object to values
result = set(output)
print(result)

Ниже приведена еще одна пробная версия, основанная на комментариях, все еще не повезло. Я пытался сгенерировать среднюю координату точки 1 (1, 2) и точки 2 (3, 4). Итак, результат, на который я смотрю: (2,3)

import itertools

def func(x1,y1,x2,y2):
    return [(x1+x2)/2, (y1/y2)/2]

numbers = (1,2,3,4)
output = itertools.starmap(func, numbers)
print(output)
print(list(output))

По-прежнему отображаются ошибки, как показано ниже.


TypeError                                 Traceback (most recent call last)
<ipython-input-28-498adec1dee9> in <module>()
      7 output = itertools.starmap(func, numbers)
      8 print(output)
----> 9 print(list(output))

TypeError: 'int' object is not iterable

Обновленный код, который работает для меня. Просто добавьте [] в числах

import itertools

def func(x1,y1,x2,y2):
    return [(x1+x2)/2, (y1/y2)/2]

numbers = [[1,2,3,4],[5,6,7,8]]
output = itertools.starmap(func, numbers)
print(list(output))

Действительно ценю ваши входные данные.

Ответы [ 2 ]

2 голосов
/ 11 января 2020

Как я уже упоминал в своем комментарии, вы не понимаете, как на самом деле работает map (а теперь starmap).

Я верю, что вы пытаетесь достичь sh вызывает func с вашими четырьмя переменными, определенными в numbers = (1, 2, 3, 4). Предполагая, что это так, вы можете просто сделать

>>> func(*numbers)

, чтобы "распаковать" кортеж numbers в четыре обязательных аргумента для func.


Теперь, надеюсь, проясните путаницу на map. Функция map принимает два параметра: вызываемую функцию и итерируемую. Затем для каждого элемента в итерируемом вызове функции.

Итак, map(func, numbers) эквивалентно:

>>> func(1)
>>> func(2)
>>> func(3)
>>> func(4)

, что явно неверно, поскольку вашей функции требуется 4 параметра, а не 1.

При starmap, состояние документа:

Используется ... когда параметры аргумента уже сгруппированы в кортежи из одной итерируемой

, что заставляет его работать где-то между map и ответом, который я предложил выше.

Когда вы делаете starmap(func, numbers), вы фактически делаете:

>>> func(*1)
>>> func(*2)
>>> func(*3)
>>> func(*4)

, который затем вызывает TypeError: 'int' object is not iterable. Примечание: это происходит при вызове list(...), потому что starmap является ленивым и фактически ничего не делает, пока в этом нет крайней необходимости, что находится внутри преобразования в list.

Чтобы starmap работал, вам нужно поместить numbers внутри итерируемого, такого как itertools.starmap(func, [numbers]). Это даст вам эффективный вызов func(*numbers), который идентичен моему первоначальному предложению.

Я настоятельно рекомендую вам прочитать iterables , обращая пристальное внимание на iterators, а также распаковка списков аргументов .

1 голос
/ 10 января 2020

Из python документов :

map (function, iterable, ...)

Возврат итератора который применяет функцию к каждому элементу итерации, давая результаты. Если передаются дополнительные итерируемые аргументы, функция должна принимать столько аргументов и применяется к элементам из всех итерируемых параллельно. С несколькими итерациями итератор останавливается, когда самая короткая итерация исчерпана. Для случаев, когда входные данные функции уже организованы в кортежи аргументов, см. Itertools.starmap ().

С здесь :

itertools.starmap (function, iterable)

Создайте итератор, который вычисляет функцию, используя аргументы, полученные из iterable. Используется вместо imap (), когда параметры аргумента уже сгруппированы в кортежи из одной итерации (данные были «предварительно упакованы»).

Таким образом, вы можете использовать

import itertools

my_map_obj = itertools.starmap(func, [numbers])
print(list(my_map_obj))

, чтобы получить объект карты. Затем вы можете преобразовать в список, чтобы получить значения (в данном случае только одно значение, потому что вы передали только один набор аргументов).

Это печатает [1.0]

EDIT

Теперь, когда вопрос обновил определение func для возврата списка, теперь он печатает [[2.0, 0.25]]

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