Python ลิสต์ (List)



จนถึงตอนนี้ตัวแปรของเราเก็บค่าได้ทีละหนึ่งค่า พอเจองานที่ต้องเก็บของหลายชิ้น เช่น รายชื่อนักเรียน 30 คน เราคงไม่สร้างตัวแปร 30 ตัว ลิสต์คือชนิดข้อมูลที่เก็บหลายค่าไว้ในตัวเดียว เรียงต่อกันเป็นลำดับ

สร้างลิสต์

ใช้วงเล็บเหลี่ยม [] คั่นสมาชิกด้วยจุลภาค

fruits = ["แอปเปิล", "กล้วย", "ส้ม"]
scores = [85, 90, 78, 92]
mixed = ["สมชาย", 25, True, 1.75]
empty = []

ลิสต์เก็บข้อมูลชนิดไหนก็ได้ และปนกันได้ด้วย แต่ในทางปฏิบัติเรามักเก็บของชนิดเดียวกันทั้งลิสต์ เพราะเอาไปวนลูปประมวลผลง่ายกว่า

เข้าถึงสมาชิก

เหมือน string เลย ใช้เลขลำดับ (index) เริ่มนับจาก 0 และติดลบคือนับจากท้าย

fruits = ["แอปเปิล", "กล้วย", "ส้ม", "องุ่น"]

print(fruits[0])    # แอปเปิล
print(fruits[2])    # ส้ม
print(fruits[-1])   # องุ่น
print(fruits[-2])   # ส้ม

ถ้าใส่ index เกินขอบเขตจะ error

print(fruits[10])   # IndexError: list index out of range

แก้ไขสมาชิก

ต่างจาก string ตรงที่ลิสต์แก้ไขได้ กำหนดค่าใหม่ให้ตำแหน่งที่ต้องการได้เลย

fruits = ["แอปเปิล", "กล้วย", "ส้ม"]
fruits[1] = "มะม่วง"
print(fruits)   # ['แอปเปิล', 'มะม่วง', 'ส้ม']

เพิ่มสมาชิก

fruits = ["แอปเปิล", "กล้วย"]

fruits.append("ส้ม")           # ต่อท้าย
print(fruits)                  # ['แอปเปิล', 'กล้วย', 'ส้ม']

fruits.insert(1, "องุ่น")       # แทรกที่ตำแหน่ง 1
print(fruits)                  # ['แอปเปิล', 'องุ่น', 'กล้วย', 'ส้ม']

fruits.extend(["มะม่วง", "ทุเรียน"])   # ต่อหลายตัวจากลิสต์อื่น
print(fruits)

append() เป็นตัวที่ใช้บ่อยสุด โดยเฉพาะเวลาสร้างลิสต์ขึ้นมาทีละตัวในลูป

squares = []
for i in range(1, 6):
    squares.append(i ** 2)
print(squares)   # [1, 4, 9, 16, 25]

ลบสมาชิก

fruits = ["แอปเปิล", "กล้วย", "ส้ม", "องุ่น"]

fruits.remove("กล้วย")     # ลบด้วยค่า (ตัวแรกที่เจอ)
print(fruits)              # ['แอปเปิล', 'ส้ม', 'องุ่น']

last = fruits.pop()        # ดึงตัวสุดท้ายออกมา พร้อมคืนค่า
print(last)                # องุ่น
print(fruits)              # ['แอปเปิล', 'ส้ม']

del fruits[0]              # ลบด้วยตำแหน่ง
print(fruits)              # ['ส้ม']

fruits.clear()             # ล้างทั้งลิสต์
print(fruits)              # []

วนลูปในลิสต์

วิธีปกติคือ for หยิบสมาชิกมาทีละตัว

scores = [85, 90, 78, 92]

for score in scores:
    print(score)

ถ้าต้องใช้เลขลำดับด้วย ใช้ enumerate()

students = ["สมชาย", "สมหญิง", "สมศรี"]

for i, name in enumerate(students, start=1):
    print(f"{i}. {name}")

ฟังก์ชันและเมท็อดที่ใช้บ่อย

scores = [85, 90, 78, 92, 88]

print(len(scores))       # 5  จำนวนสมาชิก
print(sum(scores))       # 433
print(max(scores))       # 92
print(min(scores))       # 78
print(sum(scores) / len(scores))   # 86.6  ค่าเฉลี่ย

เรียงลำดับ

scores = [85, 90, 78, 92]

scores.sort()              # เรียงน้อยไปมาก แก้ลิสต์เดิม
print(scores)              # [78, 85, 90, 92]

scores.sort(reverse=True)  # มากไปน้อย
print(scores)              # [92, 90, 85, 78]

ถ้าไม่อยากแก้ลิสต์เดิม ใช้ sorted() มันคืนลิสต์ใหม่

original = [3, 1, 2]
new_list = sorted(original)
print(original)   # [3, 1, 2]  ไม่เปลี่ยน
print(new_list)   # [1, 2, 3]

ค้นหาและนับ

fruits = ["แอปเปิล", "กล้วย", "ส้ม", "กล้วย"]

print("ส้ม" in fruits)          # True
print(fruits.count("กล้วย"))     # 2
print(fruits.index("ส้ม"))       # 2  ตำแหน่งที่เจอครั้งแรก

ระวัง: ลิสต์ก๊อปด้วย = ไม่ได้

การเอาลิสต์ไปกำหนดให้ตัวแปรใหม่ ไม่ได้สร้างลิสต์ใหม่ แต่เป็นการชี้ไปที่ลิสต์เดิม แก้ตัวหนึ่งกระทบอีกตัว

a = [1, 2, 3]
b = a
b.append(4)
print(a)   # [1, 2, 3, 4]  a เปลี่ยนตามด้วย!

ถ้าอยากได้ก๊อปแยกจริง ใช้ .copy() หรือ list()

a = [1, 2, 3]
b = a.copy()
b.append(4)
print(a)   # [1, 2, 3]  ไม่กระทบ
print(b)   # [1, 2, 3, 4]

ตัวอย่างรวม: สรุปคะแนนสอบ

scores = []

print("กรอกคะแนน (พิมพ์ done เพื่อจบ)")
while True:
    raw = input("คะแนน: ")
    if raw == "done":
        break
    scores.append(float(raw))

if scores:
    print(f"จำนวน  : {len(scores)} คน")
    print(f"เฉลี่ย  : {sum(scores) / len(scores):.2f}")
    print(f"สูงสุด  : {max(scores)}")
    print(f"ต่ำสุด  : {min(scores)}")
else:
    print("ไม่มีข้อมูล")

ผลลัพธ์:

กรอกคะแนน (พิมพ์ done เพื่อจบ)
คะแนน: 80
คะแนน: 75
คะแนน: 90
คะแนน: done
จำนวน  : 3 คน
เฉลี่ย  : 81.67
สูงสุด  : 90.0
ต่ำสุด  : 75.0

สรุป

  • ลิสต์เก็บหลายค่าในตัวแปรเดียว สร้างด้วย [] เข้าถึงด้วย index เริ่มที่ 0
  • แก้ไขได้ (ต่างจาก string): append() insert() remove() pop() del
  • len() sum() max() min() sorted() และ in ใช้บ่อยมาก
  • b = a ไม่ได้ก๊อปลิสต์ ต้องใช้ a.copy()

บทถัดไปว่าด้วยทูเพิล (Tuple) ญาติของลิสต์ที่แก้ไขไม่ได้ และเทคนิค unpacking