python - 在第二个列表的条件下对列表元素求和

标签 python loops optimization

我正在尝试将两个相关列表的某些元素相加。我会举一个例子让你明白我在说什么。最后我写了我的代码,它可以工作,但我想优化它,否则我必须手写很多东西。如果问题不有趣,我们深表歉意。

list1 = [4.0, 8.0, 14.0, 20.0, 22.0, 26.0, 28.0, 30.0, 32.0, 34.0, 36.0, 38.0, 40.0]
list2 = [2.1, 1.8, 9.5, 5., 5.4, 6.7, 3.3, 5.3, 8.8, 9.4, 5., 9.3, 3.1]

列表 1 对应于时间,所以我想做的是每 10 [时间单位] 对所有内容进行聚类,即从列表 1 我可以看到第一个和第二个元素属于 0-10 范围,所以我会需要在list2中添加他们对应的点。稍后从 list1 中我看到第三个和第四个元素属于范围 (10< time <= 20),所以我在 list2 中添加相同的元素,稍后对于第三个范围,我需要在 list3 中添加以下 4 个元素和很快。最后我想创建 2 个新列表

list3 = [10., 20., 30., 40.]
list4 = [3.9, 14.5, 20.7, 35.6]

我写的代码如下:

list1 = [4.0, 8.0, 14.0, 20.0, 22.0, 26.0, 28.0, 30.0, 32.0, 34.0, 36.0, 38.0, 40.0]
list2 = [2.1, 1.8, 9.5, 5., 5.4, 6.7, 3.3, 5.3, 8.8, 9.4, 5., 9.3, 3.1]
list3 = numpy.arange(0., 40., 10.)
a = [[] for i in range(4)]

for i, j in enumerate(list1):
    if 0.<=j<=10.:
        a[0].append(list2[i])
    elif 10.<j<=20.:
        a[1].append(list2[i])
    elif 20.<j<=30.:
        a[2].append(list2[i])
    elif 30.<j<=40.:
        a[3].append(list2[i])

list4 = [sum(i) for i in a]

它有效,但是,实际上 list1 更大(几个数量级)并且我不想手写所有 if(以及我制作的子列表)。任何建议将不胜感激。

最佳答案

首先,如果我们谈论的是巨大 集,我会使用numpypandas 或为此设计的其他工具.根据我的经验,Python 本身不适用于元素超过 1000 万的事物(除非数据中有您可以利用的结构)。

现在我们可以按如下方式使用它:

<b>import numpy as np</b>

# construct lists
l1 = np.array(list1)
l2 = np.array(list2)

# determine the "groups" of the values
g = (l1-0.00001)//10

# create a boolean mask that determines where the groups change
flag = np.concatenate(([True], g[1:] != g[:-1]))

# determine the indices of the swaps
inv_idx, = flag.nonzero()

# calculate the sum per subrange
result = np.add.reduceat(list2,inv_idx)

对于您的样本输出,这给出了:

>>> result
array([  3.9,  14.5,  20.7,  35.6])

0.00001 用于将 20.0 推送到某个 19.9999 并因此将其分配给第 1 组而不是第 2 组。优势这种方法的优点在于 (a) 它适用于任意数量的“组”,以及 (b) 在列表上完成固定数量的“滑动”,因此它与列表中的元素数量成线性比例。

关于python - 在第二个列表的条件下对列表元素求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43918254/

相关文章:

python - 无法在docker中安装nltk

javascript - jQuery $.each 与 for 循环对象

Python for 循环与或?

python - sqlalchemy bulk_insert_mappings 生成大量插入批处理,这是可以避免的吗?

python - 使用 cumsum 查找独特的章节

python - 加速Python函数处理数据段以空格分隔的文件

python - Vim 带圆括号和方括号的缩进级别

c++ - 以完全相同的方式重写数组后,数组中的二分搜索就可以工作

php - Codeigniter 优化/加载模型的最佳位置是?

html - 如何避免溢出 :hidden? 的性能成本