2013-12-03 107 views
5

我有一個列表如下。如何分隔Python列表中的字符串和數字?

list = ['perfect','data1', 'queryda873', 'server187', 'tuplip91', 'time'] 

我該如何區分列表中的標記和數字?我想要類似於:

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

謝謝。

+0

你怎麼辦one2three?一,二,三? – GoingTharn

+0

我試圖用「match = re.match(r」(....([0-9] + ..)「但不知道。 – theteddyboy

回答

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,因爲這個名字是採取內置的功能。

+0

關於'list'作爲一個名字的好處,但[Never使用字符'l'(小寫字母el),'O'(大寫字母哦)或'I'(大寫字母眼睛)作爲單個字符變量名。](http://www.python.org/dev/ peps -pep-0008 /#要避開的名稱) – nmichaels

+0

@nmichaels我會說這對於這樣的小片段來說並不是什麼大不了的事,但如果你願意的話,我會改變它 – arshajii

+0

哦,我同意。 – nmichaels

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'] 
+0

抱歉,你能解釋itertools.chain.from_iterable(破)嗎?我試圖運行但錯誤警報。 – theteddyboy

+0

你得到了什麼錯誤,你使用的是什麼版本的Python? –

+0

我正在使用2.7.6 – theteddyboy

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'] 
相關問題