我有两段代码s.t.
- 一个在系统中产生一组活动警报
- 第二次消耗警报升/降的事件。
假设第一部分产生以下流
["a", "b"]
,
["c"]
,
["e", "f", "g"]
,
我想把这些推到一边
("a", True)
,
("b", True)
,
("c", True)
,
("a", False)
,
("b", False)
,
("e", True)
,
("f", True)
,
("g", True)
,
("c", False)
。
到系统的第二部分。
我可以做以下
events=[["a", "b"], ["c"], ["e", "f", "g"]]
alerts = Observable\
.from_(events)\
.map(lambda x : set(x))\
.scan(lambda (prev, events), curr : (curr, {(i, True) for i in curr - prev}.union(\
{(i, False) for i in prev - curr})),\
(set(), set()))\
.map(lambda (prev, events) : events)
subject = rx.subjects.Subject()
def my_flatten(set):
for x in set:
subject.on_next(x)
subject.subscribe(lambda x : print(x))
alerts.subscribe(my_flatten)
产生以下结果,这是好的
('a', True)
('b', True)
('b', False)
('a', False)
('c', True)
('c', False)
('g', True)
('e', True)
('f', True)
但是我希望有一个没有主题的解决方案,如下所示
events=[["a", "b"], ["c"], ["e", "f", "g"]]
alerts = Observable\
.from_(events)\
.map(lambda x : set(x))\
.scan(lambda (prev, events), curr : (curr, {(i, True) for i in curr - prev}.union(\
{(i, False) for i in prev - curr})),\
(set(), set()))\
.flat_map(lambda (prev, events) : events)
alerts.subscribe(lambda x : print(x))
警告=可观察\ .from_(事件)\ .map(lambda x:set(x))\ .scan(lambda(prev,events),curr :( curr,{(i,True)for i in curr - prev} .union({(i,False)for i in prev - curr})),(set( ),set())) .map(lambda(prev,events):events)
但它产生以下内容,这是不正确的,因为您无法从中重建活动事件,c
最终会变为活动状态。
('a', True)
('b', True)
('b', False)
('a', False)
('c', False)
('c', True)
('g', True)
('e', True)
('f', True)
flat_map
不保留订单,您认为还有其他解决方案吗?
谢谢你,
迈克尔