การจัดลำดับองค์ประกอบข้อมูลในลำดับเฉพาะเป็นการดำเนินการที่ต้องการบ่อย ในการจัดเรียงองค์ประกอบในอาร์เรย์ Python ใช้ฟังก์ชันชื่อ sorted() และ array.sort()
sorted(array)
ฟังก์ชันนี้คืนค่าอาร์เรย์ที่จัดเรียงแล้วโดยไม่แก้ไขอาร์เรย์เดิม
a = [9, 5, 3, 1, 12, 6]
b = sorted([9, 5, 3, 1, 12, 6])
print("Sorted Array:\n", b)
print("Original Array:\n", a)
การรันโค้ดข้างต้นจะได้ผลลัพธ์ดังนี้ -
Sorted Array: [1, 3, 5, 6, 9, 12] Original Array: [9, 5, 3, 1, 12, 6]
list.sort()
ฟังก์ชัน sort คืนค่าอาร์เรย์ที่จัดเรียงแล้วโดยแก้ไขอาร์เรย์ที่ส่งมา inplace ดังนั้นอาร์เรย์เดิมจึงถูกแก้ไข ตามตัวอย่างด้านล่าง
a = [9, 5, 3, 1, 12, 6]
print("Original Array:\n", a)
print("Sorted Array:\n")
a.sort()
print(a)
การรันโค้ดข้างต้นจะได้ผลลัพธ์ดังนี้ -
Original Array: [9, 5, 3, 1, 12, 6] Sorted Array: [1, 3, 5, 6, 9, 12]
ดังนั้น sorted() ช้ากว่า sort() เพราะมันสร้างสำเนาของอาร์เรย์เดิมก่อนแล้วค่อยแก้ไข
ความต้องการการจัดเรียงที่ซับซ้อนกว่านี้ทำได้ด้วย NumPy NumPy เป็นไลบรารี Python ที่ใช้กันอย่างกว้างขวางในการประมวลผลข้อมูลทางวิทยาศาสตร์ เพราะมีฟีเจอร์ขั้นสูงมากมาย เราจะดูทั้งวิธีจัดเรียงแบบ Python ธรรมดาและ NumPy ในตัวอย่างด้านล่าง
numpy.argsort
ฟังก์ชันนี้ใน NumPy คืนค่าดัชนีของอาร์เรย์ที่จัดเรียงแล้ว แทนที่จะเป็นองค์ประกอบของอาร์เรย์ ในตัวอย่างด้านล่าง เราเอาอาร์เรย์ พิมพ์องค์ประกอบพร้อมดัชนีของแต่ละองค์ประกอบ จากนั้นใช้ฟังก์ชัน argsort ซึ่งให้ดัชนีของอาร์เรย์ที่จัดเรียงแล้วเป็นผลลัพธ์ และผลลัพธ์ก็เป็นอาร์เรย์เช่นกัน
import numpy as np
x = np.array([9, 5, 3, 1, 12, 6])
print(x)
# พิมพ์ตำแหน่งขององค์ประกอบ
for i in range(len(x)):
print("[", i, "]", x[i])
print("\n")
# พิมพ์ดัชนีขององค์ประกอบที่จัดเรียงแล้ว
s = np.argsort(x)
print(s)
การรันโค้ดข้างต้นจะได้ผลลัพธ์ดังนี้ -
[ 9 5 3 1 12 6] [ 0 ] 9 [ 1 ] 5 [ 2 ] 3 [ 3 ] 1 [ 4 ] 12 [ 5 ] 6 [3 2 1 5 0 4]
numpy.lexsort
ฟังก์ชันนี้ใช้สำหรับการจัดเรียงด้วย sort keys หลายตัวที่เกี่ยวข้องกับมากกว่าหนึ่งอาร์เรย์ ตัวอย่างเช่น เราจัดเรียงข้อมูลใน Column A ก่อน แล้วจัดเรียงค่าใน Column B ในตัวอย่างด้านล่าง เราใช้อาร์เรย์สองอาร์เรย์แทน Column A และ Column B เมื่อใช้ฟังก์ชัน lexsort() สำหรับจัดเรียงก่อนโดย Column A แล้วตามด้วย Column B เราจะได้ผลลัพธ์ของการจัดเรียงเป็นอาร์เรย์ที่มีดัชนีขององค์ประกอบใน Column A
import numpy as np colA = [2, 5, 1, 8, 1] # คอลัมน์แรก colB = [9, 0, 3, 2, 0] # คอลัมน์ที่สอง # จัดเรียงโดย ColA แล้วตามด้วย colB sorted_index = np.lexsort((colB, colA)) print(sorted_index) # พิมพ์ผลลัพธ์แสดงค่าคอลัมน์เป็นคู่ print([(colA[i], colB[i]) for i in sorted_index])
การรันโค้ดข้างต้นจะได้ผลลัพธ์ดังนี้ -
[4 2 0 1 3] [(1, 0), (1, 3), (2, 9), (5, 0), (8, 2)]
เห็นได้ว่าค่าต่ำสุดสองค่าใน colA คือ 1 และ 1 ที่ตำแหน่งดัชนี 2 และ 4 แต่ผลลัพธ์แสดง 4 และ 2 เป็นลำดับเพิ่มขึ้น เนื่องจากค่าที่สอดคล้องใน Column B ซึ่งคือ 0 และ 3 ก็จัดเรียงเป็น 0 ก่อน 3 ทำให้ผลลัพธ์เป็น 4 และ 2