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

2024-04-20 11:44:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一堆字符串通过list(string)插入到列表中:

stringy = "I've 24got a 697love-a-ly2 bunch of 000coconuts!"
listy = list(stringy)

其中listy看起来像:

^{pr2}$

我正在寻找一种更简洁的方法来遍历列表,并且在不抛出任何单个字符项的情况下,将所有整数合并在一起以生成:

['I', "'", 'v', 'e', ' ', '24', 'g', 'o', 't', ' ', 'a', ' ', '697','l','o'...

整数在字符串中的位置是不可预测的,数字中的位数也是不可预测的(我可能会遇到1或1000000000)

要想找到整数值,首先要考虑以下几点:

for i in listy:
    if i.isdigit():
        x = listy.index(i)
        z = listy[x+1]
        if z.isdigit():

…但那只会是一个低效的血腥混乱。在

实际上,把这些数字放在一起会很容易,但我很难想出一个简单的方法来检查每个数字。有什么建议吗?在


Tags: of方法字符串列表stringifve数字
3条回答

我会使用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', '!']

groupby使用键函数将序列拆分为连续的组。在本例中,我的keyfunction是c.isdigit() or c,对于数字它将返回True,对于非数字则返回字符。不过,正如@gnibbler指出的,我们需要小心,不要意外地合并相邻字符。。在

不过,第二步,我们不需要count技巧:

^{pr2}$

另一种方法是从反向列表(或堆栈)中弹出()字符:

>>> groups = []
>>> rlisty = list(reversed(listy))
>>> while rlisty:
    char = rlisty.pop()
    groupedchar = char
    while rlisty: # Look ahead for digits
        # Take next char from rlist
        nextchar = rlisty.pop()
        if nextchar.isdigit():
            groupedchar += nextchar # Group digits together
        else:
            # Put back into list for next loop
            rlisty.append(nextchar)
            break

    groups.append(groupedchar)   

>>> groups
['I', "'", 'v', 'e', ' 24', 'g', 'o', 't', ' ', 'a', ' 697', 'l', 'o', 'v', 'e', '-', 'a', '-', 'l', 'y2', ' ', 'b', 'u', 'n', 'c', 'h', ' ', 'o', 'f', ' 000', 'c', 'o', 'c', 'o', 'n', 'u', 't', 's', '!']

您可以很简单地使用^{}

>>> 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', '!']

如果要多次执行此操作,则应考虑将其编译为

^{pr2}$

相关问题 更多 >