use*_*818 1 python string list
我通过以下方式将一堆字符串推入列表list(string):
stringy = "I've 24got a 697love-a-ly2 bunch of 000coconuts!"
listy = list(stringy)
Run Code Online (Sandbox Code Playgroud)
其中listy的样子:
['I', "'", 'v', 'e', ' ', '2', '4', 'g', 'o', 't', ' ', 'a', ' ', '6', '9'...
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种更简洁的方法来遍历列表,并且在不丢弃任何单个字符条目的情况下,将所有整数连接在一起以产生:
['I', "'", 'v', 'e', ' ', '24', 'g', 'o', 't', ' ', 'a', ' ', '697','l','o'...
Run Code Online (Sandbox Code Playgroud)
整数将在字符串中的位置是不可预测的,并且数字中的位数也是不可预测的(我可以遇到1或1000000000.)
要在第一时间找到整数值,请考虑以下内容:
for i in listy:
if i.isdigit():
x = listy.index(i)
z = listy[x+1]
if z.isdigit():
Run Code Online (Sandbox Code Playgroud)
......但这只是一个低效的血腥混乱.
实际上将数字放在一起会非常容易,但我很难找到一个简洁的方法来检查每个数字.有什么建议?
Jar*_*red 10
你可以这么简单地使用re,
>>> import re
>>> a = "I've 24got a 697love-a-ly2 bunch of 000coconuts!"
>>> re.findall(r'\d+|.', a)
['I', "'", 'v', 'e', ' ', '24', 'g', 'o', 't', ' ', 'a', ' ', '697', 'l', 'o', 'v', 'e', '-', 'a', '-', 'l', 'y', '2', ' ', 'b', 'u', 'n', 'c', 'h', ' ', 'o', 'f', ' ', '000', 'c', 'o', 'c', 'o', 'n', 'u', 't', 's', '!']
Run Code Online (Sandbox Code Playgroud)
如果您多次执行此操作,您应该考虑将其编译为,
>>> splitter = re.compile(r'\d+|.')
Run Code Online (Sandbox Code Playgroud)
我会使用itertools.groupby(免责声明:我用它来做所有事情......)
>>> from itertools import groupby, count
>>> tick = count()
>>> [''.join(group) for key, group in groupby(sy, lambda c: c.isdigit() or next(tick))]
['I', "'", 'v', 'e', ' ', '24', 'g', 'o', 't', ' ', 'a', ' ', '697', 'l', 'o', 'v', 'e', '-', 'a', '-', 'l', 'y', '2', ' ', 'b', 'u', 'n', 'c', 'h', ' ', 'o', 'f', ' ', '000', 'b', 'a', 'l', 'l', 'o', 'o', 'n', 's', '!']
Run Code Online (Sandbox Code Playgroud)
groupby使用键功能将序列分成连续的组.在这种情况下,我的keyfunction是c.isdigit() or c,对于数字和非数字的字符将返回True.正如@gnibbler指出的那样,我们需要小心,我们不会意外地合并连续的字符.
第二,我们不需要这个count技巧:
>>> from itertools import groupby, chain
>>> gg = ([''.join(group)] if key else list(group) for key, group in groupby(sy, str.isdigit))
>>> list(chain.from_iterable(gg))
['I', "'", 'v', 'e', ' ', '24', 'g', 'o', 't', ' ', 'a', ' ', '697', 'l', 'o', 'v', 'e', '-', 'a', '-', 'l', 'y', '2', ' ', 'b', 'u', 'n', 'c', 'h', ' ', 'o', 'f', ' ', '000', 'b', 'a', 'l', 'l', 'o', 'o', 'n', 's', '!']
Run Code Online (Sandbox Code Playgroud)