对本身位于元组中的元组(可迭代的可迭代)求和的最有效方法是啥?

Posted

技术标签:

【中文标题】对本身位于元组中的元组(可迭代的可迭代)求和的最有效方法是啥?【英文标题】:What is the most efficient way to sum across tuples that are themselves within a tuple (iterable of an iterable)?对本身位于元组中的元组(可迭代的可迭代)求和的最有效方法是什么? 【发布时间】:2019-12-03 03:11:07 【问题描述】:

本质上,我正在生成一个元组:

import datetime
import csv

from itertools import product, combinations, chain

part_1 = 
    'a':2,1,0,
    'b':3,4,5,
    'c':7,8,9,
    'd':10,11,12      


sorted_part_1 = sorted(part_1)
result = product(*(part_1[Thing] for Thing in sorted_part_1))

# for a in result:
#   print('comb a' + str(a))

comb_list_total = it.combinations(result,4)

(虽然有几个订单更多的排列。)

我想做的是对每个元组/可迭代求和,例如((2, 5, 9, 11), (2, 5, 9, 12), (2, 5, 7, 10), (2, 5, 7, 11)) --> (8,20,32,44)

(我实际上想要做的是然后得到聚合元组和预定义元组之间的差异,例如 (50,50,50,50) -> (32,30,18,6)最后,对差异求和,以确定哪个元组最大化/最小化聚合差异。)

如何对元组执行此数学运算,并有效地将结果映射到原始元组?

【问题讨论】:

你介意使用 pandas/numpy 吗? 由于您要求和的元组是组合生成的,我会寻找一种数学方法来简化总和,而无需显式计算它。如果我们能够计算出product 中的每个组合应该出现在结果中的次数,那么我们可以乘法而不是加法;同样,如果我们可以计算part_1 中的每个数字应该出现在总和中的次数。 【参考方案1】:

先决条件:

iterable_of_tuples = [
    (...),  # tuple 1
    (...),  # tuple 2
    ...
    (...)   # tuple N
]

使用 numpy:

import numpy as np

sum_of_all_tuples = tuple(sum(np.array(t) for t in iterable_of_tuples))

纯 Python(对长迭代可能效率较低):

sum_of_all_tuples = tuple(map(sum, zip(*iterable_of_tuples))))

【讨论】:

以上是关于对本身位于元组中的元组(可迭代的可迭代)求和的最有效方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

元组--补充

元组--补充

Python 元组拆包

从甚至可迭代的[重复]中获取2元组的可迭代

为啥不接受 Map 构造函数的可迭代元组数组?

Python 具名元组——我不只是可不变列表