создание списка значений путем перебора списков в вызове метода - PullRequest
0 голосов
/ 27 января 2020

Я хочу создать список значений, который является результатом подачи двух списков переменных (init_list и fin_list) в уравнение, сохраненное в методе (yoy_eq).

Я пытался добавить результат вызова yoy_eq, используя списочные выражения, которые перебирают init_list и fin_list, но возвращает:

TypeError: неподдерживаемые типы операндов для -: 'list' и 'list'

Как я могу кормить yoy_eq int из списка, а не сам список?

Я пробовал это:

init_list = [y_2000,y_2005,y_2010]
fin_list = [y_2005,y_2010,y_2015]


def yoy_eq(init,fin):
    return (init-fin) * 100 /init


y = []

y.append(yoy_eq([i for i in init_list],[i for i in fin_list]))

И это:

def yoy_eq(init,fin):
    return (init-fin) * 100 /init





def iterator(a):
    for i in a:
        return a
    


y.append((yoy_eq(iterator(init_list),iterator(fin_list)))

Ответы [ 4 ]

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

Код, который вы предоставили, будет работать с numpy массивами, которые выполняют поэлементную арифметику c.

Однако для чистого Python вам нужно для итерации вручную:

def yoy_eq(init,fin):
    'Return a new list combining *init* and *fin*'
    return [(init_value - fin_value) * 100 / init_value
            for init_value, fin_value in zip(init, fin)]

При numpy итерация происходит бесплатно:

>>> import numpy as np
>>> init = np.array([2000, 2010, 2020])
>>> fin =  np.array([2004, 2050, 2075])
>>> (init-fin) * 100 / init
array([-0.2       , -1.99004975, -2.72277228])
0 голосов
/ 27 января 2020

map может выполнять итерацию по двум спискам, учитывая функцию, которая принимает два аргумента.

init_list = [y_2000,y_2005,y_2010]
fin_list = [y_2005,y_2010,y_2015]


def yoy_eq(init,fin):
    return (init-fin) * 100 /init

y = list(map(yoy_eq, init_list, fin_list))

или вы можете сжать два списка вместе и использовать понимание списка, чтобы применить функцию.

y = [yoy_eq(x, y) for x, y in zip(init_list, fin_list)]
0 голосов
/ 27 января 2020

Используя понимание списка, вы можете попробовать это:

init_list = [y_2000,y_2005,y_2010]
fin_list = [y_2005,y_2010,y_2015]


def yoy_eq(init,fin):
    return (init-fin) * 100 /init


y = [yoy_eq(init_list[i], fin_list[i]) for i in range(len(init_list))]

или, возможно, лучше:

y = [yoy_eq(init, fin) for init,fin in zip(init_list, fin_list)]
0 голосов
/ 27 января 2020

Надеюсь, это то, что вы ищете:

def yoy_eq(init, fin):
    return [
        (it1 - it2) * 100 / it1
        for it1, it2 in zip(init, fin)
    ]

, где it1 - итератор списка инициализации, а it2 - итератор списка плавников

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