假设我有三个包含两列的表(即“时间”和“值”),并且我想将它们存储在不同的数组中:
Time1 = [1,2,5,6,7]
Time2 = [1,2,3,7,8]
Time3 = [1,2,5,7,9]
Value1 = [1,4,2,2,6]
Value2 = [1,3,3,2,5]
Value3 = [1,1,1,1,1]
三个“时间”数组已经按升序排列。我想知道在这些条件下计算第四对数组的最简单方法:
- 第一个:一个新的“Time”数组,其中包含所有三个“Time”数组中的所有元素
- 第二个:“Time”数组中元素匹配的索引处“Value”中元素的总和
使用我的示例,输出将是:
Time4 = [1,2,7]
Value4 = [Value1[0]+Value2[0]+Value3[0],Value1[1]+Value2[1]+Value3[1],Value1[4]+Value2[3]+Value3[3]]
最简单的方法是使用逐步检查:
j = 0
k = 0
for i in range(len(Value1)):
if Time1[i] == Time2[j] == Time3[k]:
Time4.append(Time1)
Value4.append(Value1[i]+Value2[j]+Value3[k])
j += 1
k += 1
但是,当“if”条件不发生时,后面会出现许多条件控制。基本上,我应该增加“正确”索引,直到恢复“if”条件,因为“时间”数组已经按递增顺序排列,即:
elif Time1[i]>Time2[j]:
if Time1[i]>Time3[k]:
print 'A value in Time1 is missing'
j += 1
k += 1
等等。如果我要比较 3 个以上的数组,情况会变得更糟。那么,有没有更简单的方法呢?
预先感谢所有帮助我的人。
最佳答案
对于 (1),使用集合。它们有一个很大的优势,那就是它们只存储唯一的值,并且许多操作速度更快。
unique_times = set(Time1) & set(Time2) & set(Time3)
现在,unique_times
将包含所有集合中出现的所有时间(因此是 &
)。
对于(2),我下一步要做的是在原始数组中找到这些时间的索引。
for time_array, value_array in zip([Time1, Time2, Time3], [Value1, Value2, Value3]):
time_indices = [idx for idx,time in time_array if time in unique_times]
values = [value_array[idx] for idx in time_indices]
total = sum(values)
这样做的一个问题是,将时间和值存储在多个变量中会导致每次数组数量发生变化时都必须更改代码。使用数字来命名不同变量的事实表明您正在重复自己,这在编码中从来都不是一个好主意。所以我的建议是找到一种方法将所有时间存储在一个多维数组中,将所有值存储在另一个多维数组中。您会发现事情很快就会得到优化。
关于Python:仅在选定索引处对三个或更多数组的值求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48909069/