迭代列表并连接相同类型的项目

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)


DSM*_*DSM 6

我会使用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)

  • 有些人在面对问题时会想"我知道,我会使用正则表达式".现在他们有两个问题.有些人在遇到问题时会想"我知道,我会使用itertools".现在他们有了`next(takewhile(not_,count()))`问题. (4认同)