Как самостоятельно определить функцию, которая работает для сокращения одноэлементного списка? - PullRequest
0 голосов
/ 07 июня 2019

Я хочу вернуть сумму подмассива в списке диктов. Например, [{'name': 'a', 'array': [1, 2, 3]}, {'name': 'b', 'array': [3, 3, 4]}], должны возврат 16.

a = {'name': 'a', 'array': [1, 2, 3]}
b = {'name': 'b', 'array': [3, 3, 4]}

Я определил функцию, подобную этой:

def sum_array(x, y):
    return sum(x['array']) + sum(y['array'])

На самом деле это хорошо работает для [a, b]

reduce(sum_array, [a, b])    ### this works well and returns 16

Но для одноэлементного массива он вернется сам,

reduce(sum_array, [a])  ### this returns {'name': 'a', 'array': [1, 2, 3]}

Если я хочу вернуть 6, как мне определить функцию?

Ответы [ 3 ]

1 голос
/ 07 июня 2019

Даже если вы хотите использовать reduce (вы, вероятно, не должны), это не работа только для reduce. Для каждого элемента списка вы хотите взять sum(element['array']), а затем вы хотите сложить эти суммы вместе. Часть sum(element['array']) является операцией mapping , и это задание для map, а не reduce. Сложение сумм - это сокращение.

С map и reduce код будет выглядеть так:

from operator import add

def mapper(d):
    return sum(d['array'])

l = [a] # or l = [a, b], or l = whatever else you want

result = reduce(add, map(mapper, l))

Было бы более эффективно и читабельно использовать sum и генэксп, хотя:

result = sum(sum(x['array']) for x in l)
0 голосов
/ 07 июня 2019
a = {'name': 'a', 'array': [1, 2, 3]}
b = {'name': 'b', 'array': [3, 3, 4]}

def sum_array(init, x):
    return init + sum(x['array'])

reduce(sum_array, [a], 0) 

Это хорошо работает для меня.

0 голосов
/ 07 июня 2019

попробуйте этот лайнер:

result = sum([sum(x["array"]) for x in inp_list])
...