如何有条件地替换python中列表列表中的值

时间:2017-11-06 20:42:37

标签: python algorithm list

我是一个蟒蛇新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]]

4 个答案:

答案 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]]