
itertools.pairwise: เดินคู่ติดกันในลำดับโดยไม่เขียน zip เอง
น้องกายEngineering
อยากไล่ดูค่าติดกันในลิสต์ เช่น ช่วงห่างระหว่างจุด หรือเทียบบรรทัดก่อน-หลัง ผมเคยเขียน zip(xs, xs[1:]) จนเจอ pairwise
itertools.pairwise มีตั้งแต่ Python 3.10 คืนคู่ (s0, s1), (s1, s2), ... จาก iterable หนึ่งตัว ใช้ได้กับ generator ที่สไลซ์ไม่ได้
เมื่อไหร่ควรใช้
- วัด delta ระหว่างค่าต่อเนื่อง
- ตรวจว่าช่วงเวลา/เลขเรียงไม่กระโดดเกินเกณฑ์
- ประมวลผลสตรีมทีละคู่โดยไม่โหลดทั้งก้อนเป็นลิสต์ก่อน (ยังต้องเก็บค่าก่อนหน้าหนึ่งตัวภายใน)
from __future__ import annotations
import unittest
from itertools import pairwise
def max_gap(nums):
return max((b - a for a, b in pairwise(nums)), default=0)
class PairwiseTests(unittest.TestCase):
def test_pairs(self):
self.assertEqual(list(pairwise([1, 2, 3, 4])), [(1, 2), (2, 3), (3, 4)])
def test_short(self):
self.assertEqual(list(pairwise([1])), [])
self.assertEqual(list(pairwise([])), [])
def test_max_gap(self):
self.assertEqual(max_gap([1, 2, 8, 9]), 6)
self.assertEqual(max_gap([3]), 0)
if __name__ == "__main__":
unittest.main()
Recap
- จำว่า
pairwiseต้องการ Python 3.10+ - ใช้แทน
zip(xs, xs[1:])เมื่อ iterable สไลซ์ไม่ได้ - ลำดับสั้นกว่า 2 ตัวได้ลิสต์ว่าง — ตั้งค่า default ในงานรวมผล