问题: 我有两个包含需要合并的元组(每个由时间戳和队列长度组成)的列表:
L1 = [[0, 50], [7.75, 120], [10.25, 70], [17, 100], [20, 60]]
L2 = [[0, 80], [8, 120], [10, 85], [10.25, 80]]
Run Code Online (Sandbox Code Playgroud)
我需要一个merge(L1,L2)返回的函数:
[[ 0.00, 50+80 ],
[ 7.75, 120+80 ],
[ 8.00, 120+120],
[10.00, 85+120],
[10.25, 70+80 ],
[17.00, 100+80 ],
[20.00, 60+80 ]] # note
Run Code Online (Sandbox Code Playgroud)
[注意:我不需要60+80- 它只是表明添加了哪些值,结果是60+80= 140我需要的]
我从上面的输出中提取的是我反复:
V从不同时间戳的合并列表中弹出最小值(setwise union timestamps).V从小于或等于的非时间戳列表中添加队列长度V.V筋疲力尽.我的问题: 我很确定heapq可以解决它,但无法理解如何使用heapq-module构建解决方案.
更多漫无边际的细节:
50+80- 取自L1[0][0] == L2[0][0] L1[0][1]+L2[0][1] = 50+80.我现在用过L1[0][:]和L2[0][:]L1[1][0] = 120.为了获得该化合物队列长度,因此需要加L1[1][1]用L2[0][1]得到120+80.L2[1][0]是8.00.L2需要合并的队列长度L1最大值,小于或等于10.00 ...按照事件发生的顺序迭代事件,并保留上次操作的时间戳(last_time),这样如果下一个事件具有相同的时间戳,但来自另一个队列,则这两个更改将合并为一个项目在result。
def merge(a, b):
l1 = [(t, value, 1) for (t, value) in a]
l2 = [(t, value, 2) for (t, value) in b]
events = l1 + l2
events.sort()
last_time = -1
result = []
c1 = 0
c2 = 0
for t, value, index in events:
if index == 1:
c1 = value
if index == 2:
c2 = value
if t == last_time:
result.pop()
result.append((t, c1 + c2))
last_time = t
return result
Run Code Online (Sandbox Code Playgroud)
In [26]: L1 = [[0, 50], [7.75, 120], [10.25, 70], [17, 100], [20, 60]]
L2 = [[0, 80], [8, 120], [10, 85], [10.25, 80]]
merge(L1, L2)
Out[26]: [(0, 130), (7.75, 200), (8, 240), (10, 205), (10.25, 150), (17, 180), (20, 140)]
Run Code Online (Sandbox Code Playgroud)