[英]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.