如何在Python列表中分离字符串和数字?

5
我有一个如下的列表。
list = ['perfect','data1', 'queryda873', 'server187', 'tuplip91', 'time']

我该如何将列表中的令牌和数字分开? 我需要像这样的东西:

list = ['perfect','data', '1', 'queryda','873', 'server','187', 'tulip','91', 'time']

谢谢你。

感谢你。


你对于one2three怎么处理?是指1,2,3吗? - GoingTharn
我正在尝试使用"match = re.match(r"(....([0-9]+..)",但是不知道该怎么做。 - theteddyboy
3个回答

10
你可以尝试使用正则表达式(re)。特别地,使用\d+|\D+:
>>> import re
>>> 
>>> L = ['perfect','data1', 'queryda873', 'server187', 'tuplip91', 'time']
>>> 
>>> [s for v in (re.findall(r'\d+|\D+', s) for s in L) for s in v]
['perfect', 'data', '1', 'queryda', '873', 'server', '187', 'tuplip', '91', 'time']

顺便提一下,你不应该将变量命名为list,因为该名称已被内置函数使用。


@nmichaels 我认为对于这样的小片段来说并不是什么大问题,但如果你愿意的话我可以改变它。 - arshajii
哦,我同意。我只是有点追求严谨而已。 - nmichaels
太好了,但是天哪,那真的很难读。 - Ian McLaird
1
@theteddyboy 先将所有的附加操作完成,然后在最后打印输出。myList=mylist.append(s) 存在问题。 - arshajii
@theteddyboy list.append 在原列表中直接进行修改,并返回 None - Steinar Lima
显示剩余2条评论

0
我意识到这个问题已经有一个被接受的答案,但是我必须添加这个替代方案,因为我认为它更易于阅读和理解。
import re
import itertools

lst = ['perfect','data1', 'queryda873', 'server187', 'tuplip91', 'time']
broken = map(lambda s: re.findall(r'\d+|\D+', s), lst)
merged = list(itertools.chain.from_iterable(broken))
# merged is now ['perfect', 'data', '1', 'queryda', '873', 'server', '187', 'tuplip', '91', 'time']

抱歉,您能解释一下itertools.chain.from_iterable(broken)吗?我尝试运行但出现了错误提示。 - theteddyboy
你遇到了什么错误,使用的是哪个版本的Python? - Ian McLaird
1
@theteddyboy chain.from_iterable可以将嵌套的可迭代对象“展平”(即将[[1,2],[3,4]]转换为iter([1,2,3,4]))。 - Steinar Lima
我在2.7.3上运行该代码时没有任何警告或错误。不过我不确定你看到了什么。 - Ian McLaird

0

使用itertools.groupby

l = ['perfect','data1', 'queryda873', 'server187', 'tuplip91', 'time']
from itertools import groupby
[''.join(g) for x in l for k,g in groupby(x, key=lambda y: y.isdigit())]
['perfect', 'data', '1', 'queryda', '873', 'server', '187', 'tuplip', '91', 'time']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接