แนวคิด
สตริงที่ "ตัวอักษรห่างกันเท่ากัน" หมายถึง ความต่างของ Unicode code point ระหว่างตัวอักษรติดกันคงที่ ตลอดสตริง เช่น 'abc' (diff=1), 'mpsv' (diff=3), 'agms' (diff=6)
ตัวอย่างโค้ด
my_list = ["abc", "egfg", "mpsv", "abed", 'xzbd', 'agms']
print("ลิสต์:", my_list)
my_result = [
sub for sub in my_list
if all(ord(sub[i+1]) - ord(sub[i]) == ord(sub[1]) - ord(sub[0])
for i in range(len(sub) - 1))
]
print("สตริง equidistant:", my_result)
ผลลัพธ์
ลิสต์: ['abc', 'egfg', 'mpsv', 'abed', 'xzbd', 'agms']
สตริง equidistant: ['abc', 'mpsv', 'agms']
คำอธิบาย
ord(c)คืนค่า Unicode code point ของตัวอักษร- คำนวณ diff ของคู่แรก:
ord(sub[1]) - ord(sub[0]) all(...)ตรวจสอบว่าคู่อื่นๆ มี diff เท่ากันหมด'egfg': e->g=2, g->f=-1, f->g=1 -> ไม่เท่ากัน'abed': a->b=1, b->e=3, e->d=-1 -> ไม่เท่ากัน
กรณีสตริงความยาว 1
สตริงความยาว 1 จะถือว่า equidistant โดยค่าเริ่มต้น (vacuously true) หากต้องการตัดออก ให้เพิ่ม len(sub) > 1 ในเงื่อนไข