今天早些时候,我需要一个字符串2个字符一次迭代解析格式化像一个字符串"+c-R+DE"
(有几个字母)。
我结束了这一点,这工作,但它看起来丑陋。 我结束了评论它是什么做的,因为它感觉不明显。 这看起来几乎是Python的,但并不完全。
# Might not be exact, but you get the idea, use the step
# parameter of range() and slicing to grab 2 chars at a time
s = "+c-R+D-e"
for op, code in (s[i:i+2] for i in range(0, len(s), 2)):
print op, code
是否有一些更好/更简洁的方式来做到这一点?
Answer 1:
不知道关于清洁剂,但还有另一种选择:
for (op, code) in zip(s[0::2], s[1::2]):
print op, code
不复制版本:
from itertools import izip, islice
for (op, code) in izip(islice(s, 0, None, 2), islice(s, 1, None, 2)):
print op, code
Answer 2:
也许这将是清洁?
s = "+c-R+D-e"
for i in xrange(0, len(s), 2):
op, code = s[i:i+2]
print op, code
也许你可以写一个生成器做你想要什么,也许这将是更Python :)
Answer 3:
三联激发了更广泛的解决方案:
def slicen(s, n, truncate=False):
assert n > 0
while len(s) >= n:
yield s[:n]
s = s[n:]
if len(s) and not truncate:
yield s
for op, code in slicen("+c-R+D-e", 2):
print op,code
Answer 4:
from itertools import izip_longest
def grouper(iterable, n, fillvalue=None):
args = [iter(iterable)] * n
return izip_longest(*args, fillvalue=fillvalue)
def main():
s = "+c-R+D-e"
for item in grouper(s, 2):
print ' '.join(item)
if __name__ == "__main__":
main()
##output
##+ c
##- R
##+ D
##- e
izip_longest
需要Python 2.6(或更高)。 如果关于Python 2.4或2.5,使用定义izip_longest
从文档或改变石斑鱼功能:
from itertools import izip, chain, repeat
def grouper(iterable, n, padvalue=None):
return izip(*[chain(iterable, repeat(padvalue, n-1))]*n)
Answer 5:
对于发电机巨大的机会。 对于较大的列表,这会比荏苒每隔elemnent更有效。 请注意,此版本还负责与悬挂串op
小号
def opcodes(s):
while True:
try:
op = s[0]
code = s[1]
s = s[2:]
except IndexError:
return
yield op,code
for op,code in opcodes("+c-R+D-e"):
print op,code
编辑:轻微重写,以避免ValueError异常例外。
Answer 6:
其他答案做工精良对于n = 2,但是一般情况下,你可以试试这个:
def slicen(s, n, truncate=False):
nslices = len(s) / n
if not truncate and (len(s) % n):
nslices += 1
return (s[i*n:n*(i+1)] for i in range(nslices))
>>> s = '+c-R+D-e'
>>> for op, code in slicen(s, 2):
... print op, code
...
+ c
- R
+ D
- e
>>> for a, b, c in slicen(s, 3):
... print a, b, c
...
+ c -
R + D
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ValueError: need more than 2 values to unpack
>>> for a, b, c in slicen(s,3,True):
... print a, b, c
...
+ c -
R + D
Answer 7:
这种方法支持每个结果元素的任意数量,评估懒惰地,输入可迭代可以是发生器(没有索引尝试):
import itertools
def groups_of_n(n, iterable):
c = itertools.count()
for _, gen in itertools.groupby(iterable, lambda x: c.next() / n):
yield gen
任何遗留的元素在较短的列表中返回。
实例:
for g in groups_of_n(4, xrange(21)):
print list(g)
[0, 1, 2, 3]
[4, 5, 6, 7]
[8, 9, 10, 11]
[12, 13, 14, 15]
[16, 17, 18, 19]
[20]
Answer 8:
>>> s = "+c-R+D-e"
>>> s
'+c-R+D-e'
>>> s[::2]
'+-+-'
>>>
Answer 9:
也许不是最有效的,但如果你喜欢的正则表达式...
import re
s = "+c-R+D-e"
for op, code in re.findall('(.)(.)', s):
print op, code
Answer 10:
我遇到了类似的问题。 截至做这样的事情:
ops = iter("+c-R+D-e")
for op in ops
code = ops.next()
print op, code
我觉得这是最可读的。
Answer 11:
这里是我的答案,一点点清洁我的眼睛:
for i in range(0, len(string) - 1):
if i % 2 == 0:
print string[i:i+2]
Answer 12:
考虑pip
安装more_itertools
,已经附带了一个chunked
与其他有用的工具一起实现:
import more_itertools
for op, code in more_itertools.chunked(s, 2):
print(op, code)
输出:
+ c
- R
+ D
- e
文章来源: Iterate over a string 2 (or n) characters at a time in Python