试试这个:
s = '1234567890'
print([s[idx:idx+2] for idx in range(len(s)) if idx % 2 == 0])
输出:
['12', '34', '56', '78', '90']
from itertools import islice
def split_every(n, iterable):
i = iter(iterable)
piece = list(islice(i, n))
while piece:
yield piece
piece = list(islice(i, n))
s = '1234567890'
print list(split_every(2, list(s)))
yield ''.join(piece)
才能使其按预期工作:https://eval.in/813878 - Paulo Freitas>>> from functools import reduce
>>> from operator import add
>>> from itertools import izip
>>> x = iter('1234567890')
>>> [reduce(add, tup) for tup in izip(x, x)]
['12', '34', '56', '78', '90']
>>> x = iter('1234567890')
>>> [reduce(add, tup) for tup in izip(x, x, x)]
['123', '456', '789']
对于那些喜欢一行代码的人,像往常一样:
n = 2
line = "this is a line split into n characters"
line = [line[i * n:i * n+n] for i, blah in enumerate(line[::n])]
print(line)
时,输出是 this is a line split into n characters
。你可能会更好地将代码改为:line = [line[i * n:i * n+n] for i,blah in enumerate(line[::n])]
。修复此问题后,它将成为一个不错的答案 :)。 - Peter David Carter,blah
并说明它的必要性吗?我注意到我可以用任何字母替换 blah
,但不能使用数字,并且不能删除 ,blah
或/和逗号。我的编辑器建议在 ,
后添加空格 :s - toonarmycaptainmore_itertools.sliced
曾经提到过。这里还有来自more_itertools
库的四个选项:
s = "1234567890"
["".join(c) for c in mit.grouper(2, s)]
["".join(c) for c in mit.chunked(s, 2)]
["".join(c) for c in mit.windowed(s, 2, step=2)]
["".join(c) for c in mit.split_after(s, lambda x: int(x) % 2 == 0)]
['12', '34', '56', '78', '90']
讨论选项的文档:grouper
,chunked
,windowed
,split_after
def split(s, n):
if len(s) < n:
return []
else:
return [s[:n]] + split(s[n:], n)
print(split('1234567890', 2))
或以以下形式:
def split(s, n):
if len(s) < n:
return []
elif len(s) == n:
return [s]
else:
return split(s[:n], n) + split(s[n:], n)
这段内容更加明确地展示了递归方法中典型的分治模式(尽管实际上没有必要这样做)
groupby
的解决方案:from itertools import groupby, chain, repeat, cycle
text = "wwworldggggreattecchemggpwwwzaz"
n = 3
c = cycle(chain(repeat(0, n), repeat(1, n)))
res = ["".join(g) for _, g in groupby(text, lambda x: next(c))]
print(res)
输出:
['www', 'orl', 'dgg', 'ggr', 'eat', 'tec', 'che', 'mgg', 'pww', 'wza', 'z']
这些答案都很好,而且也都能用,但是语法太晦涩了... 为什么不写一个简单的函数呢?
def SplitEvery(string, length):
if len(string) <= length: return [string]
sections = len(string) / length
lines = []
start = 0;
for i in range(sections):
line = string[start:start+length]
lines.append(line)
start += length
return lines
然后简单地调用它:
text = '1234567890'
lines = SplitEvery(text, 2)
print(lines)
# output: ['12', '34', '56', '78', '90']
另一种解决方案是使用groupby
和index//n
作为键来分组字母:
from itertools import groupby
text = "abcdefghij"
n = 3
result = []
for idx, chunk in groupby(text, key=lambda x: x.index//n):
result.append("".join(chunk))
# result = ['abc', 'def', 'ghi', 'j']
for i in range(len(s))
即可。为什么要遍历每个值然后扔掉一半?直接跳过不需要的值:for i in range(0, len(s), 2)
(省略if
部分)。 - Arthur Tacca