假设我有三个包含两列的表(即“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]
三个“时间”数组已经处于递增的顺序。我想知道用这些条件计算第四个数组的最简单方法:
使用我的例子,输出将是:
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个阵列进行比较,情况会变得更糟。那么,有没有更简单的方法呢?
提前感谢所有帮助我的人。
答案 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)
这样做的一个问题是,在多个变量中存储时间和值会导致每次更改数组时都必须更改代码。您使用数字来命名不同的变量这一事实表明您正在重复自己,这在编码中绝不是一个好主意。所以我的建议是找到一种方法将所有时间存储在一个多维数组中,将所有值存储在另一个多维数组中。你会发现事情会很快得到优化。