การนับสตริงที่ซ้ำกันติดต่อกันจากรายการ

ฉันมีรายการสตริงของ Python ที่

ป้อนข้อมูล:

li = ['aaa','bbb','aaa','abb','abb','bbb','bbb','bbb','aaa','aaa']

ฉันจะทำอย่างไรเพื่อสร้างรายการอื่นที่นับจำนวนการทำซ้ำติดต่อกันของสตริงในรายการ สำหรับรายการด้านบนรายการส่งคืนจะมีลักษณะดังนี้:

ผลลัพธ์ที่คาดหวัง:

li_count = [['aaa',1],['bbb',1]['abb',2],['bbb',3],['aaa',2]]

person swopnilnep    schedule 13.06.2018    source แหล่งที่มา
comment
คุณยังไม่ลืมอันที่สองไม่ใช่ซ้ำ 'aaa' เหรอ? li_count = [['aaa',1],['bbb',1],['aaa',1],['abb',2],['bbb',3],['aaa,2]] ควรจะถูกต้อง และโปรดแสดงให้เห็นว่าความพยายามของคุณเป็นอย่างไรและเหตุใดจึงไม่ได้ผล   -  person SpghttCd    schedule 13.06.2018


คำตอบ (1)


ใช้ itertools.groupby:

from itertools import groupby
li = ['aaa','bbb','aaa','abb','abb','bbb','bbb','bbb','aaa','aaa']

a = [[i, sum(1 for i in group)] for i, group in groupby(li)]
print(a)
[['aaa', 1], ['bbb', 1], ['aaa', 1], ['abb', 2], ['bbb', 3], ['aaa', 2]]

ขอบคุณ @ user3483203 สำหรับการปรับปรุง:

a = [[i, len([*group])] for i, group in groupby(li)]
person jezrael    schedule 13.06.2018
comment
การใช้ [[i, len([*group])] for i, group in groupby(li)] เร็วกว่ามาก เร็วกว่า sum ประมาณสองเท่า - person user3483203; 13.06.2018