簡體   English   中英

如何有條件地替換python中列表列表中的值

[英]how to conditionally replace values in list of lists in python

我是一個蟒蛇新bie。
我有兩個這樣的列表列表:

A = List[List[float,float]]   
B = List[List[float,float]]  

兩種尺寸不同Ex:

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

我想要做的是:
如果A的時間不在B中,我應該將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]]

即,如果B中的時間段在A中不存在對應的時間值,則對應於該時間的值應為零。 在這種情況下,B中存在2到5之間的值,因此A中的'3'和'4'的伙伴值被設為零。

請告訴我怎么做。 我在這里提到: Python - 如何更改列表列表中的值? 列表到numpy數組

所以我得到的一個想法是將B轉換為單個列表,然后比較AA和A的值。但是我沒有取得多大進展。

AA = numpy.hstack(B) # for getting array of times
for i in 1: len(AA):
     if (AA[i]==A[

對於簡單的問題,嵌套循環設計通常可以讓您快速解決,而無需擔心列表展平函數的細節。

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

編輯:只是要清楚,包括'break'語句沒有必要去解決方案,但它有助於避免不必要的計算。 如果我們確定A中的項目確實有一個有效時間,我們可以安全地停止搜索B中的時間段並繼續下一個A項目。

如果你壓扁 B,那么你可以比較它:

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

Bvals = [item for sublist in B for item in sublist]
print(Bvals)
newA = [x if x[0] in Bvals else [x[0], 0.0] for x in A]
print(newA)

Outputs:
[0.0, 2.0, 5.0, 6.0]
[[0.0, 10.0], [1.0, 0.0], [2.0, 10.0], [3.0, 0.0], [4.0, 0.0], [5.0, 10.0], [6.0, 10.0]]

我想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])

另外,如果您正在進行間隔檢查,這可能不是最有效的方法。 查看間隔樹 ,它是用於執行各種與間隔相關的查詢的數據結構(包括您的查詢)。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM