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