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

Python 在列表上迭代并连接相同类型的项,python,string,list,Python,String,List,我通过list(string)将一堆字符串塞进列表中: 其中,listy看起来像: ['I', "'", 'v', 'e', ' ', '2', '4', 'g', 'o', 't', ' ', 'a', ' ', '6', '9'... 我正在寻找一种更简洁的方法来迭代列表,并且在不抛出任何单个字符条目的情况下,将所有整数连接在一起以生成: ['I', "'", 'v', 'e', ' ', '24', 'g', 'o', 't', ' ', 'a', ' ', '697','l','o'.

我通过
list(string)
将一堆字符串塞进列表中:

其中,
listy
看起来像:

['I', "'", 'v', 'e', ' ', '2', '4', 'g', 'o', 't', ' ', 'a', ' ', '6', '9'...
我正在寻找一种更简洁的方法来迭代列表,并且在不抛出任何单个字符条目的情况下,将所有整数连接在一起以生成:

['I', "'", 'v', 'e', ' ', '24', 'g', 'o', 't', ' ', 'a', ' ', '697','l','o'...
整数在字符串中的位置是不可预测的,数字中的位数也是不可预测的(我可以运行到1或100000000)

要首先查找整数值,请考虑以下内容:

for i in listy:
    if i.isdigit():
        x = listy.index(i)
        z = listy[x+1]
        if z.isdigit():
…但那将是一场低效的血腥混乱

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

我会用(免责声明:我什么都用它.)

groupby
使用键函数将序列拆分为连续组。在本例中,我的键函数是
c.isdigit()或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', '!']
我会使用(免责声明:我什么都用它)

groupby
使用键函数将序列拆分为连续组。在本例中,我的键函数是
c.isdigit()或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', '!']

你可以很简单地用

如果你多次做这个操作,你应该考虑编译它,比如

>>> splitter = re.compile(r'\d+|.')

你可以很简单地用

如果你多次做这个操作,你应该考虑编译它,比如

>>> splitter = re.compile(r'\d+|.')

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


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


冒着被否决使用c风格解决方案(而不是pythonic列表comps)的风险,下面是一个易于阅读的解决方案:

>>> stringy = "I've 24got a 697love-a-ly2 bunch of 000coconuts!"
>>> x = list(stringy)
>>> i = 0
>>> l = []
>>> while i < len(x):
        t = ''
        while x[i].isdigit():
                t += x[i]
                i += 1
        if t:
                l.append(t)
                i -= 1
        else:
                l.append(x[i])
        i += 1


>>> l
['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', '!']
>>>
>>stringy=“我有一堆697love-a-ly2的1000颗椰子!”
>>>x=列表(stringy)
>>>i=0
>>>l=[]
>>>而i>>l
[I'
>>>

唯一令人困惑的部分可能是
i-=1
。这就是为什么当内部while循环运行时,
i
不会得到双增量,然后外部会再次增量。

冒着使用c风格解决方案(而不是pythonic list comps)被否决的风险,下面是一个易于阅读的解决方案:

>>> stringy = "I've 24got a 697love-a-ly2 bunch of 000coconuts!"
>>> x = list(stringy)
>>> i = 0
>>> l = []
>>> while i < len(x):
        t = ''
        while x[i].isdigit():
                t += x[i]
                i += 1
        if t:
                l.append(t)
                i -= 1
        else:
                l.append(x[i])
        i += 1


>>> l
['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', '!']
>>>
>>stringy=“我有一堆697love-a-ly2的1000颗椰子!”
>>>x=列表(stringy)
>>>i=0
>>>l=[]
>>>而i>>l
[I'
>>>

唯一令人困惑的部分可能是
i-=1
。就是这样,
i
在内部while循环运行时不会得到双倍增量,然后外部会再次增量。

啊,itertools,有什么你不擅长的吗?好。。。Python作为一种语言,任何东西都是惯用的。我并不是什么都使用
groupby
。。但是当我看到一个问题说“我有一系列的foo,我想加入/group/不管是什么样的吧”,很难不立即思考
groupby
。。有些人在遇到问题时,会思考“我知道,我会使用正则表达式。”现在他们有两个问题。有些人在遇到问题时会想“我知道,我会使用itertools。”现在他们有
next(takewhile(not_u,count())
问题。这对
sy=“我有一堆697love-a-ly2 000个气球不起作用!“
Nice fix摆脱lambdaAh itertools,有什么你不擅长的吗?好吧……Python作为一种语言,在习惯用法上可以做的任何事情。我不是什么都使用
groupby
的……但是当我看到一个问题说“我有一个foo序列,我想加入/group/不管是什么样的“,很难不立即思考
groupby
…有些人在遇到问题时会想“我知道,我会使用正则表达式。”现在他们有两个问题。有些人在遇到问题时会想“我知道,我会用itertools。”现在他们有了
next(takewhile(not_uu,count())
问题。这不适用于
sy=“我有一堆697love-a-ly2 000个气球!”
很好的解决办法摆脱lambda作为旁注:永远不要使用
listy.index(I)
从值中获取索引。除了速度慢得多之外,它也不起作用。如果有两个元素的值为
'2'
索引('2')
总是会找到第一个元素。只需对x执行
,我在enumerate(listy)中改为:
。作为旁注:永远,永远不要使用
listy.index(i)
>>> stringy = "I've 24got a 697love-a-ly2 bunch of 000coconuts!"
>>> x = list(stringy)
>>> i = 0
>>> l = []
>>> while i < len(x):
        t = ''
        while x[i].isdigit():
                t += x[i]
                i += 1
        if t:
                l.append(t)
                i -= 1
        else:
                l.append(x[i])
        i += 1


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