RxPy:如何将元素集流转换为单个元素流

时间:2018-02-26 13:26:12

标签: flatmap rx-py

我有两段代码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不保留订单,您认为还有其他解决方案吗?

谢谢你,
迈克尔

0 个答案:

没有答案