2013-07-21 48 views
4
計數

比方說,我有以下形式的字符串:替換字符串條紋

"000000111100011100001011000000001111" 

,我想創建一個包含1條紋的長列表:

[4, 3, 1, 2, 4] 

對此有沒有很好的一行?

回答

15

如果你不介意的from itertools import groupby ...

>>> from itertools import groupby 
>>> [len(list(g)) for k, g in groupby(s) if k == '1'] 
[4, 3, 1, 2, 4] 
-6
>>> s = "000000111100011100001011000000001111" 
>>> items = set(s) 
>>> counts = [s.count(x) for x in items] 
>>> counts 
[1, 1] 
>>> 
+7

不是一個問題的答案。 – Hidde

+3

OP甚至顯示輸出應該是什麼,這不符合你寫的東西.. –

+0

該死的比我想的晚...對不起 – RussW

2

可與正則表達式來完成,雖然不是很優雅的迭代工具解決方案

answer = [len(item) for item in filter(None, re.split(r"[^1]+", test_string))] 

,或者更優雅:

answer = [len(item) for item in re.findall(r"1+", test_string)] 

and mo再優雅依舊(學分喬恩):

answer = map(len, re.findall("1+", test_string)) 
+0

爲什麼不只是使用匹配長度來加1''? – icktoofay

+0

@icktoofay哦,是啊,這會讓這個更好,更新 –

+3

如何只是︰'map(len,re.findall('1+',s))' –

1
>>> mystr = "000000111100011100001011000000001111" 
>>> [len(s) for s in re.split("0+", mystr) if s] 
[4, 3, 1, 2, 4] 
1

沒有正則表達式的需要,只是str.split

>>> mystr = "000000111100011100001011000000001111" 
>>> [len(s) for s in mystr.split('0') if s] 
[4, 3, 1, 2, 4]