我有以下字符串:集團由單一的字符,否則拆分
"TTTHTHTTHTTTTHTTTHTTTTTTHTTTTTHTH"
我希望能夠通過T的組成一個列表,然後計算T的數量在第一H 。
即讓喜歡
[3, 1, 2, 4, 3, 6, 5, 1]
請告訴我最有效的方式在Python做到這一點?
我有以下字符串:集團由單一的字符,否則拆分
"TTTHTHTTHTTTTHTTTHTTTTTTHTTTTTHTH"
我希望能夠通過T的組成一個列表,然後計算T的數量在第一H 。
即讓喜歡
[3, 1, 2, 4, 3, 6, 5, 1]
請告訴我最有效的方式在Python做到這一點?
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]
您可以用一個列表理解一行做到這一點:
輸出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的輸出,這不是我想要的。 – Tim
我編輯反映,仍然比其他答案更好(更可讀,更少的代碼) –
@tim你總是可以篩選出0 ... – SwiftsNamesake
你可以做到這一點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]
或者,'[總和(1 _以g)對於k,克GROUPBY(S)如果k == 'T']'。這樣可以避免創建'g'列表,因此效率更高一些,並且避免了將RAM用於這些臨時列表。這在這裏是無關緊要的,但是當這些團體預計會很大時,這很方便。 –
這是真的,我一直在忘記'sum(1 for _in x)'。我會編輯它。謝謝。 –
不用擔心。但是不要完全刪除'len(list(g))':這對於人們瞭解這兩個選項是很好的。 –