Python:仅在选定索引处对三个或更多数组的值求和

时间:2018-02-21 15:00:41

标签: python arrays

假设我有三个包含两列的表(即“Time”和“Value”),我想将它们存储在不同的数组中:

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”数组中元素匹配的索引“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个阵列进行比较,情况会变得更糟。那么,有没有更简单的方法呢?

提前感谢所有帮助我的人。

2 个答案:

答案 0 :(得分:1)

对于您的Value数组,您将要使用list comprehension

Value4 = [Value1[i]+Value2[i]+Value3[i] for i in range(len(Value1))]

对于Time数组,您可以利用set对象。

Time4 = list(set(Time1 + Time2 + Time3))

这会连接现有数组,将此连接列表转换为一个集合(只包含唯一元素),然后转换回列表。请注意,如果重要的话,这不一定会保留顺序。如果订单有问题,那么单步执行是最好的选择。

对于它的价值,如果您认为自己最终会有更多数组,那么您应该考虑使用Time数组数组和Value数组数组,例如

Times = [ [1,2,5,6,7], [1,2,3,7,8], [1,2,5,7,9] ]
Values = [ [1,4,2,2,6], [1,3,3,2,5], [1,1,1,1,1] ]

这将使您更容易概括上述技术。像这样:

NewValue = [sum([ValList[i] for ValList in Values]) for i in range(len(Values[0]))]

NewTime = set(Times[0])
for TimeList in Times:
   NewTime = NewTime & set(TimeList)
NewTime = list(NewTime)

可悲的是,我无法想出获得Time数组的单行方式。这些适用于任何非零数量的Time / Value列表。重要假设:需要至少有一个Time数组和至少一个Value数组,并且这些数组中的每一个都需要具有相同的大小。

答案 1 :(得分:1)

对于(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)

这样做的一个问题是,在多个变量中存储时间和值会导致每次更改数组时都必须更改代码。您使用数字来命名不同的变量这一事实表明您正在重复自己,这在编码中绝不是一个好主意。所以我的建议是找到一种方法将所有时间存储在一个多维数组中,将所有值存储在另一个多维数组中。你会发现事情会很快得到优化。