บทนำ
การเรียงลำดับลิสต์หนึ่ง (values) ตามลำดับของลิสต์อีกหนึ่ง (keys) สามารถทำได้โดยใช้ zip() รวมคู่ แล้ว sorted() เรียงตาม key แล้วดึง value ออกมา
ตัวอย่างโค้ด
def sort_by_second_list(values, keys):
"""เรียง values ตามลำดับของ keys"""
paired = zip(keys, values)
sorted_pairs = sorted(paired, key=lambda x: x[0])
return [val for _, val in sorted_pairs]
# ทดสอบ 1
list1 = ['m', 'o', 'p', 'l', 'k', 'v', 'c', 'e', 'r']
list2 = [1, 0, 0, 2, 2, 1, 1, 0, 0]
print("Values:", list1)
print("Keys: ", list2)
print("ผลลัพธ์:", sort_by_second_list(list1, list2))
# ทดสอบ 2
list3 = ['h', 'k', 'l', 'p', 'q', 'p', 'k', 'l', 'h', 'm', 'u', 'z', 'f', 't']
list4 = [0, 1, 1, 1, 0, 2, 2, 2, 0, 2, 1, 2, 1, 0]
print("\nValues:", list3)
print("Keys: ", list4)
print("ผลลัพธ์:", sort_by_second_list(list3, list4))
ผลลัพธ์
Values: ['m', 'o', 'p', 'l', 'k', 'v', 'c', 'e', 'r'] Keys: [1, 0, 0, 2, 2, 1, 1, 0, 0] ผลลัพธ์: ['e', 'o', 'p', 'r', 'c', 'm', 'v', 'k', 'l'] Values: ['h', 'k', 'l', 'p', 'q', 'p', 'k', 'l', 'h', 'm', 'u', 'z', 'f', 't'] Keys: [0, 1, 1, 1, 0, 2, 2, 2, 0, 2, 1, 2, 1, 0] ผลลัพธ์: ['h', 'h', 'q', 't', 'f', 'k', 'l', 'p', 'u', 'k', 'l', 'm', 'p', 'z']
คำอธิบาย
zip(keys, values)รวมเป็นคู่ (key, value)sorted(..., key=lambda x: x[0])เรียงตาม key (element แรกของคู่)[val for _, val in ...]ดึงเฉพาะ value ออกมา- Stable sort: ค่าที่ key เท่ากัน จะคงลำดับเดิมไว้
ใช้งานกับ dict
# เรียง dictionary ตาม value
d = {'a': 3, 'b': 1, 'c': 2}
sorted_keys = [k for k, v in sorted(d.items(), key=lambda x: x[1])]
print(sorted_keys) # ['b', 'c', 'a']