2017-08-03 27 views
4

我有以下字符串:集團由單一的字符,否則拆分

"TTTHTHTTHTTTTHTTTHTTTTTTHTTTTTHTH"

我希望能夠通過T的組成一個列表,然後計算T的數量在第一H 。

即讓喜歡

[3, 1, 2, 4, 3, 6, 5, 1]

請告訴我最有效的方式在Python做到這一點?

回答

8

itertools.groupby是你的朋友

from itertools import groupby 

s = "TTTHTHTTHTTTTHTTTHTTTTTTHTTTTTHTH" 

res = [sum(1 for _ in g) for k, g in groupby(s) if k == 'T'] 
print(res) 

# [3, 1, 2, 4, 3, 6, 5, 1] 
+2

或者,'[總和(1 _以g)對於k,克GROUPBY(S)如果k == 'T']'。這樣可以避免創建'g'列表,因此效率更高一些,並且避免了將RAM用於這些臨時列表。這在這裏是無關緊要的,但是當這些團體預計會很大時,這很方便。 –

+0

這是真的,我一直在忘記'sum(1 for _in x)'。我會編輯它。謝謝。 –

+0

不用擔心。但是不要完全刪除'len(list(g))':這對於人們瞭解這兩個選項是很好的。 –

5

您可以用一個列表理解一行做到這一點:

輸出 my_list
my_string = "TTTHTHTTHTTTTHTTTHTTTTTTHTTTTTHTH" 
my_list = [len(i) for i in my_string.split('H') if len(i)>0] 

[3, 1, 2, 4, 3, 6, 5, 1] 
+0

感謝您的迴應 - 我最初嘗試過這種方式,但它包含0的輸出,這不是我想要的。 – Tim

+0

我編輯反映,仍然比其他答案更好(更可讀,更少的代碼) –

+0

@tim你總是可以篩選出0 ... – SwiftsNamesake

0

你可以做到這一點itertools:

import itertools 
s = "TTTHTHTTHTTTTHTTTHTTTTTTHTTTTTHTH" 
counts = [] 
count = 1 
for a, b in zip(s, s[1:]): 
    if a==b: 
     count += 1 
    elif a == "T": 
     counts.append(count) 
     count = 1 

給出:

counts 
=> [3, 1, 2, 4, 3, 6, 5, 1]