3

我有以下问题:我正在尝试创建所谓的“digrams”,如下所示:

如果我有一个 word foobar,我想得到一个列表或生成器,例如:["fo", "oo", "ob", "ba", "ar"]. 完美的功能是more_itertools.windowed。问题是,它返回元组,如下所示:

In [1]: from more_itertools import windowed

In [2]: for i in windowed("foobar", 2):
   ...:     print(i)
   ...:
('f', 'o')
('o', 'o')
('o', 'b')
('b', 'a')
('a', 'r')

当然我知道我可以.join(),所以我会:

In [3]: for i in windowed("foobar", 2):
   ...:     print(''.join(i))
   ...:
   ...:
fo
oo
ob
ba
ar

我只是想知道某处是否有一个功能,itertools或者more_itertools我没有看到它确实可以做到这一点。还是有一种更“pythonic”的手动方式?

4

2 回答 2

2

您可以编写自己的widowed使用切片的版本。

def str_widowed(s, n):
    for i in range(len(s) - n + 1):
        yield s[i:i+n]

这确保产生的类型与输入相同,但不再接受非索引迭代。

于 2019-04-08T01:53:50.923 回答
1

more_itertools.windowed()是pythonic。考虑也产生元组的pairwise() itertools 配方

def pairwise(iterable):
    "s -> (s0, s1), (s1, s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)

您可以轻松替换windowed()pairwise()获得通用结果 - 通用解决方案。


或者,您可以通过模拟压缩重复但偏移字符串的成对原则来分割字符串:

代码

s = "foobar"

[a + b for a, b in zip(s, s[1:])]
# ['fo', 'oo', 'ob', 'ba', 'ar']
于 2019-04-12T23:12:44.863 回答