我正在尝试将两个相关列表的某些元素相加。我会举一个例子让你明白我在说什么。最后我写了我的代码,它可以工作,但我想优化它,否则我必须手写很多东西。如果问题不有趣,我们深表歉意。
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(以及我制作的子列表)。任何建议将不胜感激。
最佳答案
首先,如果我们谈论的是巨大 集,我会使用numpy
、pandas
或为此设计的其他工具.根据我的经验,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/