>>> line = '1234567890'
>>> n = 2
>>> [line[i:i+n] for i in range(0, len(line), n)]
['12', '34', '56', '78', '90']
为了完整起见,您可以使用正则表达式来完成此操作:
>>> import re
>>> re.findall('..','1234567890')
['12', '34', '56', '78', '90']
对于奇数个字符,您可以这样做:
>>> import re
>>> re.findall('..?', '123456789')
['12', '34', '56', '78', '9']
你也可以使用以下方法,来简化更长文本的正则表达式:>>> import re
>>> re.findall('.{1,2}', '123456789')
['12', '34', '56', '78', '9']
如果字符串很长,您可以使用 re.finditer
逐块生成。
'.'*n
使其更加清晰。不需要连接、压缩、循环或列表推导式;只需找到相邻的两个字符,这正是人类大脑思考的方式。如果蒙提·派森还活着,他一定会喜欢这种方法的! - SO_fix_the_vote_sorting_bugflags=re.S
参数。 - Aran-FeyPython中已经有一个内置函数可以实现这个功能。
>>> from textwrap import wrap
>>> s = '1234567890'
>>> wrap(s, 2)
['12', '34', '56', '78', '90']
这是wrap
的文档字符串内容:
>>> help(wrap)
'''
Help on function wrap in module textwrap:
wrap(text, width=70, **kwargs)
Wrap a single paragraph of text, returning a list of wrapped lines.
Reformat the single paragraph in 'text' so it fits in lines of no
more than 'width' columns, and return a list of wrapped lines. By
default, tabs in 'text' are expanded with string.expandtabs(), and
all other whitespace characters (including newline) are converted to
space. See TextWrapper class for available keyword args to customize
wrapping behaviour.
'''
wrap
可能无法返回所要求的内容。例如,wrap('0 1 2 3 4 5', 2)
会返回['0', '1', '2', '3', '4', '5']
(元素被剥离)。 - satomacoto将元素分组成n个长度的另一种常见方法:
>>> s = '1234567890'
>>> map(''.join, zip(*[iter(s)]*2))
['12', '34', '56', '78', '90']
这个方法直接来自于zip()
文档。
>>> map(''.join, zip(*[iter('01234567')]*5))
-> ['01234']
。 - Bjornzip()
替换为itertools.zip_longest()
:map(''.join, zip_longest(*[iter(s)]*2, fillvalue=''))
。 - Paulo Freitas我认为这个版本比使用itertools库的版本更短更易读:
def split_by_n(seq, n):
'''A generator to divide a sequence into chunks of n units.'''
while seq:
yield seq[:n]
seq = seq[n:]
print(list(split_by_n('1234567890', 2)))
使用PyPI中的more-itertools:
>>> from more_itertools import sliced
>>> list(sliced('1234567890', 2))
['12', '34', '56', '78', '90']
我喜欢这个解决方案:
s = '1234567890'
o = []
while s:
o.append(s[:2])
s = s[2:]
itertools
中的 grouper()
函数:
from itertools import izip_longest
def grouper(iterable, n, fillvalue=None):
"Collect data into fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
{{链接1:Python 3.x:}}
from itertools import zip_longest
def grouper(iterable, n, *, incomplete='fill', fillvalue=None):
"Collect data into non-overlapping fixed-length chunks or blocks"
# grouper('ABCDEFG', 3, fillvalue='x') --> ABC DEF Gxx
# grouper('ABCDEFG', 3, incomplete='strict') --> ABC DEF ValueError
# grouper('ABCDEFG', 3, incomplete='ignore') --> ABC DEF
args = [iter(iterable)] * n
if incomplete == 'fill':
return zip_longest(*args, fillvalue=fillvalue)
if incomplete == 'strict':
return zip(*args, strict=True)
if incomplete == 'ignore':
return zip(*args)
else:
raise ValueError('Expected fill, strict, or ignore')
这可以通过简单的for循环实现。
a = '1234567890a'
result = []
for i in range(0, len(a), 2):
result.append(a[i : i + 2])
print(result)
输出结果看起来像 ['12','34','56','78','90','a']
我曾经陷入同样的情境。
这个方法对我起了作用:
x = "1234567890"
n = 2
my_list = []
for i in range(0, len(x), n):
my_list.append(x[i:i+n])
print(my_list)
输出:
['12', '34', '56', '78', '90']
my_list
。 - Justin Hammond
for i in range(0, len(string), n): print(string[i:i+n])
- PatrickTsubstrings = []
for i in range(0, len(line), n): substring = line[i:i+n] substrings.append(substring)
- ArduinoBensubstrings = [] for i in range(0, len(line), n): substring = line[i:i+n] substrings.append(substring)
- ArduinoBen