สมมติว่าเรามีสตริงตัวเลข s ที่มีหลายหลัก หลักอาจซ้ำกันได้ เราต้องคืนค่าคู่บางคู่ (digit, count) แทนว่าตัวเลขไหนเกิดขึ้นติดกันกี่ครั้งใน s ในการแก้ปัญหานี้ เราสามารถใช้ฟังก์ชัน groupby() จากไลบรารี itertools ฟังก์ชันนี้จะคืนค่า iterator ที่แต่ละรายการมีค่าตัวอักษรอยู่ตำแหน่งแรก และอ็อบเจ็กต์ groupby อยู่ตำแหน่งที่สอง เราต้องนับจำนวน groupby objects สำหรับแต่ละคู่
ตัวอย่างเช่น หาก s = "11522226551" ผลลัพธ์จะเป็น [(1, 2), (5, 1), (2, 4), (6, 1), (5, 2), (1, 1)] เพราะต้นทาง 1 อยู่ 2 ตัว แล้ว 5 เดียว แล้ว 2 สี่ตัว ต่อไป...
ขั้นตอนการแก้ปัญหา
- it := เรียกฟังก์ชัน groupby สำหรับ s
- ret := รายการใหม่
- สำหรับแต่ละคู่ (digit, gp) ใน it:
- เพิ่ม (digit และความยาวของ list(gp)) เข้าไปใน ret
- คืนค่า ret
ตัวอย่างโค้ด
from itertools import groupby
def solve(s):
it = groupby(s)
ret = []
for digit, gp in it:
ret.append((int(digit), len(list(gp))))
return ret
s = "11522226551"
print(solve(s))
อินพุต
"11522226551"
เอาต์พุต
[(1, 2), (5, 1), (2, 4), (6, 1), (5, 2), (1, 1)]