我有以下问题:我正在尝试创建所谓的"二字形",如下所示:
如果我有一个单词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"的手工方式?
切片编写自己的widowed
版本。
def str_widowed(s, n):
for i in range(len(s) - n + 1):
yield s[i:i+n]
这可确保生成的类型与输入相同,但不再接受非索引迭代对象。
>more_itertools.windowed()
是pythonic的。 考虑pairwise()
迭代工具配方,它也会产生元组:
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']