3

我正在学习 RxPY ,所以我需要编写一些代码,可以将每个单词的第一个字符分开。结果必须如下所示:

{'a': ['a'], 't': ['the','the'], 'l': ['low','lazy']}

我试过的。

from rx import Observable , Observer

list =['A', 'The', 'the', 'LAZY', 'Low']

o = Observable . from_ ( list )\
. filter (lambda i: i[0] == 'A' or 'Z' )\

words = o.map(lambda s: s.lower().split())

word_each = words.flat_map(lambda s: s)

ss = word_each.to_dict(lambda x: x[:1], lambda x : x)\
    .subscribe(lambda val: print(val))

那么,我该如何解决这个问题呢?我正在考虑按每个单词的第一个字符对它进行分组,但我不知道如何。

[CLOSED]
4

4 回答 4

1

我对 RxPy 一无所知,但是您可以使用 dict 和 list comps 与 vanilla python 一起完成

  d = {el[0].lower(): [e.lower() for e in lst if e[0].lower() == el[0].lower()] for el in lst}
于 2017-11-05T18:26:23.883 回答
1

使用 rx,如果你真的想以一种困难的方式来做

>>> from rx import Observable
>>> from collections import defaultdict
>>> source = Observable.from_(['A', 'The', 'the', 'LAZY', 'Low'])
>>> result = defaultdict(list)
>>> def add(value):
...     value_content = '{0}'.format(value)
...     result[value_content[0].lower()].append(value_content)
... 
>>> s = source.subscribe(on_next=lambda value: add(value), on_completed=lambda: print('Finished'))
Finished
>>> result
defaultdict(<class 'list'>, {'a': ['A'], 't': ['The', 'the'], 'l': ['LAZY', 'Low']})

如果您需要以字典的形式使用,请dict(result)按照 Chiheb Nexus 的回答中所示使用。

我把你的名字改成listmy_list

>>> my_list =['A', 'The', 'the', 'LAZY', 'Low']
>>> from itertools import groupby
>>> {key: list(val) for (key, val) in  groupby(sorted(my_list), key=lambda x: x[0].lower())}
{'a': ['A'], 't': ['The', 'the'], 'l': ['LAZY', 'Low']}
于 2017-11-05T18:30:31.783 回答
0

使用 RxPy v6 更新 2019 年 5 月

在执行这些类型的转换时,RxPy真的很出色(尽管你承认你同样可以在纯 python 中应用一个实用的解决方案)。

这是一个简单的解决方案:

from rx import Observable

list = ['A', 'The', 'the', 'LAZY', 'Low']

Observable.from_(list) \
    .map(lambda s: s.lower()) \
    .group_by(lambda s: s[0]) \
    .flat_map(lambda grp: grp.to_list()) \
    .to_dict(lambda grp: grp[0][0], lambda grp: grp) \
    .subscribe(print)

按要求输出:

# {'a': ['a'], 't': ['the', 'the'], 'l': ['lazy', 'low']}

“算法”是:

  • 将单词列表设为 Observable。
  • 映射每个单词并转换为小写。
  • 按每个单词的第一个字母分组。
  • 当我们将每个分组转换为列表时,使用 flatmap 来取消嵌套。此时,中间结果如下所示:

    ['a']
    ['the', 'the']
    ['lazy', 'low']
    
  • 现在,使用to_dict运算符转换为单个字典,其键是每个分组(列表)中第一项的第一个字母。

  • 订阅 Observable 以执行管道。
于 2019-05-05T20:14:26.850 回答
0

您可以使用defaultdict模块来完成任务。这是一个例子:

from collections import defaultdict
my_list = ['A', 'The', 'the', 'LAZY', 'Low']

def split_words(a):
    b = defaultdict(list)
    for k in a:
        b[k[0].lower()].append(k.lower())
    return b

>>> split_words(my_list)
    defaultdict(list, {'a': ['a'], 'l': ['lazy', 'low'], 't': ['the', 'the']})
>>> dict(split_words(my_list))
    {'a': ['a'], 'l': ['lazy', 'low'], 't': ['the', 'the']}
于 2017-11-05T18:53:16.747 回答