ลูกบอลสีมิ้นต์เรียงเป็นแถวโยงด้วยเส้นอำพันเป็นคู่ และนากกายยืนปลายแถว

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 ในงานรวมผล