Как применить одну и ту же функцию к нескольким спискам - PullRequest
0 голосов
/ 26 мая 2020

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

a = ['a','b','c','d','e']
b = ['b', np.nan,'c','e','a']
c = ['a','b','c','d','e']

Я знаю, что вы можете сделать это ниже, чтобы получить результат, но я хотел сделать это с разделением

a = [1 if 'a' in a else 99 for x in a]
b = [1 if 'a' in b else 99 for x in b]
c = [1 if 'a' in c else 99 for x in c]

I сначала хотите вывести ниже:

a = [1, 99, 99, 99, 99]
b = [99, 99, 99, 99, 1]
c = [99, 99, 99, 99, 1]

Затем добавьте каждый элемент в один окончательный список

sum = [199, 297, 297, 297, 101]

Ответы [ 3 ]

0 голосов
/ 26 мая 2020

Я не уверен, правильно ли я понял ваш вопрос. Как прокомментировал fgblomqvist , я заменил 1 if 'a' in a на 1 if x == 'a' в понимании списка. Затем я в основном воспроизвел ваш второй шаг с помощью for-l oop, а после этого я использовал zip для синхронного перебора значений списка всех списков, чтобы вычислить сумму.

a = ['a','b','c','d','e']
b = ['b','a','c','e','a']
c = ['a','b','c','d','e']

# add the lists to a list. 
lists = [a,b,c]

outcomes = []
for l in lists:
    outcome = [1 if x == 'a' else 99 for x in l]
    outcomes.append(outcome)
    print(f'one of the outcomes: {outcome}')


results = []

# iterate over all list values synchronously and  calculate the sum
for outs in zip(*outcomes):
    results.append(sum(outs))
    print(f'sum of {outs} is {sum(outs)}')

print(f'final result:{results}')

Это результат:

one of the outcomes: [1, 99, 99, 99, 99]
one of the outcomes: [99, 1, 99, 99, 1]
one of the outcomes: [1, 99, 99, 99, 99]
sum of (1, 99, 1) is 101
sum of (99, 1, 99) is 199
sum of (99, 99, 99) is 297
sum of (99, 99, 99) is 297
sum of (99, 1, 99) is 199
final result:[101, 199, 297, 297, 199]

редактировать: Чтобы избежать повторения цикла дважды, вы можете объединить циклы следующим образом:

lists = [a,b,c]

sums = []
for values in zip(*lists):
    the_sum = 0
    for val in values:
        the_sum += 1 if val == 'a' else 99
    sums.append(the_sum)

print(f'sums: {sums}')

Имейте в виду вы можете заменить 1 if val == 'a' else 99 на some_func(val)

0 голосов
/ 26 мая 2020
import numpy as np

a = ['a','b','c','d','e']
b = ['b', np.nan,'c','e','a']
c = ['a','b','c','d','e']

dct = {"a":1}

sum_var = [np.nansum([dct.get(aa,99), dct.get(bb,99), dct.get(cc,99)]) for (aa, bb, cc) in zip(a,b,c)]

Объяснение: вы можете использовать понимание списка (как в своем примере) с небольшими изменениями. Вместо того, чтобы перебирать один список, перебирайте коллекцию всех списков. Вы можете добиться этого, используя встроенную функцию «zip ()», которая по существу сжимает списки вместе.

Поскольку все 3 списка имеют одинаковую длину, вы можете перебирать их и применять дополнительные преобразования к каждому элементу, как показано на пример. Дополнительная функция в этом примере - это метод dictionary.get (), который получает значение для каждого ключа, здесь 1 вместо «a». Все, чего нет в словаре, вернет 99. Но точно так же вы можете использовать пользовательские функции.

0 голосов
/ 26 мая 2020

pandas делает это довольно просто (хотя я уверен, что это проще всего с numpy)

import pandas

df = pandas.DataFrame({'a':a,'b':b,'c':c})
mask = df == 'a'
df[mask] = 1
df[~mask] = 99
df.sum(axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...