我是一个蟒蛇新bie 我有两个这样的列表列表:
:)
两种尺寸不同 例如:
A = List[List[float,float]]
B = List[List[float,float]]
我想做的是:
如果A的时间不在B中,我应该将A中相应的“值”设为零。
因此输出将是:
A has [time, value]
B has [start_time, end_time]
A = [[0.0,10.0] , [1.0,10.0], [2.0,10.0], [3.0,10.0], [4.0,10.0], [5.0,10.0], [6.0,10.0]]
B = [[0.0,2.0], [5.0,6.0]]
,即如果B中的时间段在A中没有相应的时间值,则对应于该时间的值应为零。在这种情况下,B中存在2到5之间的值,因此A中的'3'和'4'的伙伴值被设为零。
请告诉我怎么做。 我在这里提到过:Python - How to change values in a list of lists?和List of lists into numpy array
所以我得到的一个想法是将B转换为单个列表,然后比较AA和A的值。但是我没有取得多大进展。
[[0.0,10.0] , [1.0,10.0], [2.0,10.0], [3.0,0.0], [4.0,0.0], [5.0,10.0], [6.0,10.0]]
答案 0 :(得分:3)
对于简单的问题,嵌套循环设计通常可以让您快速解决,而无需担心列表展平函数的细节。
for i in range(len(A)):
time = A[i][0]
isValidTime = False
for time_segment in B:
if time_segment[0] <= time <= time_segment[1]:
isValidTime = True
break
if not isValidTime:
A[i][1] = 0.0
编辑:只是要明确,包括“休息”&#39;声明并不是解决问题的必要条件,但它有助于避免不必要的计算。如果我们确定A中的某个项目确实有一个有效时间,我们可以安全地停止搜索B中的时间段,然后转到A的下一个项目。
答案 1 :(得分:2)
如果你flatten B,那么你可以比较它:
var reduceFunction1 = function(id, field) {
return field;
};
答案 2 :(得分:2)
我认为B
列表包含时间间隔,对吧?在这种情况下,您可以执行以下操作:
updated = [x if any([start <= x[0] end <= for start, end in B]) else [x[0], 0] for x in A]
对于某些人来说,这可能有点过于紧凑,但它基本上与以下内容相同:
updated = []
for time, value in A:
for start, end in B:
if start <= time and time <= end:
updated.append([time, value])
break
updated.append([time, 0])
另外,如果您正在进行间隔检查,这可能不是最有效的方法。查看interval trees,这是一个用于执行各种与时间间隔相关的查询的数据结构(包括您的查询)。
答案 3 :(得分:2)
Pythonic
单行:[[t,v if any(s <= t and t <= e for s,e in B) else 0.0] for t,v in A]
给出:
[[0.0, 10.0], [1.0, 10.0], [2.0, 10.0], [3.0, 0.0], [4.0, 0.0], [5.0, 10.0], [6.0, 10.0]]