4. โครงสร้างข้อมูลแบบลำดับ¶
Sequences: Strings, Lists, and Files
คำสั่งเกี่ยวกับข้อความ
4.1. จุดประสงค์¶
อธิบายข้อมูลประเภทข้อความและสามารถเขียนในโปรแกรมได้
สามารถใช้งานฟังก์ชันต่างๆสำหรับจัดการข้อความได้
เข้าใจหลักการของข้อมูลประเภทลำดับ (sequence) การเข้าถึงสมาชิก (indexing) สำหรับข้อมูลประเภทข้อความและ list ได้
สามารถ format ข้อความเพื่อการแสดงผลที่ทำความเข้าใจง่ายได้
สามารถเขียนคำสั่งเพื่ออ่านและเขียนไฟล์ได้
4.2. ข้อมูลประเภท ข้อความ¶
ข้อความ เป็นประเภทของข้อมูลที่พบและใช้งานบ่อยมากในซอฟต์แวร์ต่างๆ เช่น editor word processor หรือ ซอฟต์แวร์สำหรับสำนักงานอื่นๆ
ข้อความ โดยทั่วไปเรียกว่า string หรือ text สำหรับ Python ข้อมูลประเภทนี้เรียกว่า
str
4.3. การประกาศข้อมูลประเภทข้อความใน Python¶
str เป็นชุดข้อมูลที่เรียกว่า ลำดับของตัวอักขระ (sequence of
characters) อยู่ภายในคู่ของ "(double quote) หรือภายในคู่ของ '
(single quote)
หมายเหตุ สำหรับ python 3.6+ str
สามารถใช้ตัวแปร(identifier)ร่วมในข้อความได้ f'ข้อความ {ตัวแปร}'
name = 'Paul'
lastname = "Phoenix"
print("My name is ", name, lastname, '.')
print(f'My name is {name} {lastname}.')
text = f"My name is {name} {lastname}."
print(text)
type(name)
type(lastname)
print( type(text) )
# <class 'str'>
4.4. การรับข้อมูล ประเภท ข้อความ¶
name = input('Please enter your name ')
lastname = input()
print(f'Hello, {name} {lastname}.')
4.5. การจัดเก็บข้อมูลประเภท ข้อความ¶
Fig. 4.1 string representation¶
4.6. การเข้าถึงตัวอักขระใน ข้อความ โดยใช้ตัวเลขจำนวนเต็มระบุตำแหน่ง¶
name = 'Paul Phoenix'
len(name) # 12
name[0] # 'P'
name[1] # 'a'
name[4] # ' '
4.7. การระบุตำแหน่งจากด้านหลังของ ข้อความ¶
name[len(name)-3] # 'n'
name[len(name)-2] # 'i'
name[len(name)-1] # 'x'
n = len(name)
name[n-3]
name[n-2]
name[n-1]
name[-3] # 'n'
name[-2] # 'i'
name[-1] # 'x'
4.8. การตัดกลุ่มของอักขระ (slicing, substring)¶
text[start:end]
startและendเป็น ตัวแปร ที่อ้างถึงค่า จำนวนติด
name = 'Paul Phoenix'
name[0:4] # 'Paul'
name[5:12] # 'Phoenix'
ถ้าต้องการ
'Pho'จะต้องใช้คำสั่งใดคำสั่งต่อไปนี้ได้อะไร?
start = 2 end = 6 print(name[start:end])
หมายเหตุ
ผลลัพธ์จะไม่รวมตัวอักขระที่ตำแหน่ง
endstartถ้าเป็น0ไม่จำเป็นต้องระบุก็ได้name[0:4] name[:4]
endถ้าเป็นlen(name)ไม่เป็นต้องระบุก็ได้name[5:len(name)] name[5:]
ผลลัพธ์ของคำสั่งต่อไปนี้คืออะไร?
name[:]
4.9. การนำ ข้อความ มาต่อกัน¶
โดยใช้เครื่องหมาย
+name = 'Paul' lastname = 'Phoenix' name + lastname
โดยใช้เครื่องหมาย
*กับตัวเลขname * 3 4 * lastname
แบบผสม
(name * 3) + (5 * lastname) (name * 2) + (3 * ' จะไม่เข้าเรียนช้าอีกแล้ว ')
4.10. การไล่ดูตัวอักขระใน ข้อความ โดยใช้ for¶
แสดงอักขระละบรรทัด
name = 'Paul Phoenix' for ch in name: print(ch)
แสดงทุกอักขระในหนึ่งบรรทัดโดยแยกด้วยช่องว่าง
','name = 'Paul Phoenix' for ch in name: print(ch, end=',')
4.11. ตารางสรุป¶
ตัวดำเนินการ (Operator) |
ความหมาย (Meaning) |
|---|---|
|
ต่อข้อความด้านซ้ายและขวาเข้าด้วยกัน (Concatenation) |
|
ต่อข้อความตามจำนวนครั้งที่ระบุด้านซ้ายหรือด้านขวา (Repetition) |
|
การใช้ตัวเลขเพื่อระบุตำแหน่งของอักขระในข้อความ (Indexing) |
|
การใช้สองตัวเลขเพื่อตัดข้อความย่อย (Slicing) |
|
จำนวนตัวอักษรในข้อความ (Length) |
|
การไล่ดูอักขระในข้อความ (Iteration) |
4.12. การแบ่งข้อความออกเป็นกลุ่ม¶
การแบ่งกลุ่มโดยใช้ slicing
days = 'MonTueWedThuFriSatSun'
print(days[0:3]) # 'Mon'
print(days[3:6]) # 'Tue'
print(days[6:9]) # 'Wed'
print(days[9:12]) # 'Thu'
print(days[12:15]) # 'Fri'
print(days[15:18]) # 'Sat'
print(days[18:21]) # 'Sun'
print(days[0*3:1*3]) # 'Mon'
print(days[1*3:2*3]) # 'Tue'
print(days[2*3:3*3]) # 'Wed'
print(days[3*3:4*3]) # 'Thu'
print(days[4*3:5*3]) # 'Fri'
print(days[5*3:6*3]) # 'Sat'
print(days[6*3:7*3]) # 'Sun'
โจทย์ จงเขียนโปรแกรมเพื่อรับตัวเลขจากผู้ใช้แล้วแสดงชื่อวัน
Input |
Output |
|---|---|
0 |
Mon |
1 |
Tue |
2 |
Wed |
3 |
Thu |
4 |
Fri |
5 |
Sat |
6 |
Sun |
days = 'MonTueWedThuFriSatSun'
n = int(input())
print(days[n*3:(n+1)*3])
การแบ่งกลุ่มโดยระบุอักขระที่ใช้แยก (separator,delimiter) ให้เป็น ลำดับ (list)
ตัวอย่าง 1 การแบ่งด้วยช่องว่าง
' 'DAYS = 'จันทร์ อังคาร พุธ พฤหัสบดี ศุกร์ เสาร์ อาทิตย์' days = DAYS.split(' ') # ['จันทร์', 'อังคาร', 'พุธ', 'พฤหัสบดี', 'ศุกร์', 'เสาร์', 'อาทิตย์'] n = int(input()) print(days[n])
ตัวอย่าง 2 การแบ่งด้วย comma
','GPA = '3.40,2.55,3.00,3,3.65' gpas = GPA.split(',') # [ '3.40', '2.55', '3.00', '3', '3.65' ] for e in gpas: f = float(e) print( e, type(e), f, type(f) )
4.13. Exercises¶
EX0401 จงเขียนโปรแกรมเพื่อรับประโยคยาวภายในหนึ่งบรรทัดในภาษาอังกฤษจากผู้ใช้แล้วให้ระบุจำนวนคำที่ผู้ใช้กรอก โดยแต่ละคำคั่นด้วยช่องว่าง
Input |
Output |
|---|---|
Hello, Paul |
2 |
My name is Paul Phoenix. |
5 |
You are 26 years old. |
5 |
EX0402 จงเขียนโปรแกรมเพื่อรับตัวเลขจากผู้ใช้แล้วแสดงชื่อเดือนตามหมายเลขนั้น (เดือนเริ่มจาก 1 เป็น January)
Input |
Output |
|---|---|
1 |
January |
2 |
February |
3 |
March |
4 |
April |
5 |
May |
6 |
June |
7 |
July |
8 |
August |
9 |
September |
10 |
October |
11 |
November |
12 |
December |
4.14. การจัดรูปแบบการแสดงข้อความ¶
4.14.1. การจัดรูปแบบโดยใช้ %¶
name = 'Paul'
lastname = 'Phoenix'
gpa = 3.123456
print( 'GPA of %s %s is %f' % (name, lastname, gpa) )
# GPA of Paul Phoenix is 3.123456
print( 'GPA of %s %s is "%f"' % (name, lastname, gpa) )
# GPA of Paul Phoenix is "3.123456"
print( 'GPA of %s %s is "%5.2f"' % (name, lastname, gpa) )
# GPA of Paul Phoenix is " 3.12"
4.14.2. การจัดรูปแบบโดยใช้ format()¶
name = 'Paul'
lastname = 'Phoenix'
gpa = 0.123456
print( 'GPA of {} {} is {}'.format(name, lastname, gpa) )
print( 'GPA of {} {} is {:5.2f}'.format(name, lastname, gpa) )
4.14.3. การจัดรูปแบบโดยใช้ f-string สำหรับ python 3.6+¶
name = 'Paul'
lastname = 'Phoenix'
gpa = 3.123456
print( f'GPA of {name} {lastname} is {gpa:5.2f}' )
4.15. ลำดับกับข้อความ¶
ใน Python ข้อความ ถือว่าเป็น ลำดับ (sequence) และสามารถใช้ตัวดำเนินการแบบเดียวกับลำดับประเภทอื่นๆ ข้อมูลประเภทลำดับ(sequence) ที่พบบ่อยในภาษา Python คือ list ซึ่งสมาชิกในลำดับจะเป็นข้อมูลประเภทใดก็ได้ แต่โดยปกติแล้วสมาชิกใน list จะเป็นประเภทเดียวกันเพื่อให้ง่ายต่อการหาข้อผิดพลาดของ code (debug)
การประกาศลำดับแบบ list
[1, 2, 3, 4, 5, 6]
['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
a = [1, 2, 3, 4, 5, 6]
days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
type(a) # <class list>
type(days) # <class list>
list กับตัวดำเนินการ
[1, 2, 3] + [4, 5, 6] # [1, 2, 3, 4, 5, 6] [1, 2] + [1, 2] # [1, 2, 1, 2] [1, 2] * 3 # [1, 2, 1, 2, 1, 2]
list กับ indexing
a = [1, 2, 3, 4, 5, 6] days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] a[1] # 2 a[2] # 3 a[-1] # 6 days[0] # 'Mon' days[1] # 'Tue' days[-1] # 'Sun' len(a) # 6 len(days) # 7 letters = 'ABCDEF' len(letters) # 6 letters[0] # 'A' letters[1] # 'B' letters[2] # 'C' letters[-1] # 'F'
list กับ slicing
a = [1, 2, 3, 4, 5, 6] days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'] letters = 'ABCDEF' a[1:4] # [2, 3, 4] days[1:4] # ['Tue', 'Wed', 'Thu'] letters[1:4] # 'BCD'
4.16. ข้อความ str ต่างจาก list¶
สมาชิกของ ``str`` ไม่สามารถกำหนดค่าใหม่ได้
days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
letters = 'ABCDEF'
days[1] = 'Tuesday'
letters[1] = 'b'
# TypeError: 'str' object does not support item assignment
Mutable Value ค่าเปลี่ยนแปลงได้
Immutable Value ค่าเปลี่ยนแปลงได้
4.17. การเข้ารหัสตัวอักขระ¶
จำนวนอักขระที่ Python รองรับ Unicode > 100,000 โดยการเข้ารหัสแบบ UTF-8 ในช่วง
0-0x10FFFFก - ฮอยู่ในช่วง0x0E01-0x0E2Eสระ อยู่ในช่วง
0x0E30-0x0E4Fเลขไทย อยู่ในช่วง
0x0E50-0x0E590x0E01เป็นจำนวนเต็มใน Pythonคำสั่งแปลงตัวเลขเป็น ตัวอักขระ
chr(0x0E01)การระบุอักขระ
print('\u0E01')
print('\u23F0 = ⏰')
c = 0x23F0
for i in range(10):
print(chr(c+i), end=' ')
คำสั่งแปลง ตัวอักขระ เป็น ตัวเลข
ord('ก')
kor = ord('ก')
hor = ord('ฮ')
for i in range(kor, hor):
print(chr(i), end=' ')
4.18. Exercises แสดงอักขระในช่วงต่อไปนี้¶
0x2654ถึง0x265F0x2660ถึง0x2667
4.19. ฟังก์ชันที่สำคัญของ str¶
Function |
Description |
|---|---|
|
แยกข้อความเป็น list ด้วย |
|
ทำให้ตัวอักษรตัวแรกเป็นตัวพิมพ์ใหญ่ |
|
ทำให้ตัวอักษรตัวแรกของทุกคำเป็นตัวพิมพ์ใหญ่ paul |
|
ทำให้ให้ข้อความยาว 10 ตัวอักษรและข้อความต้นฉบับอยู่ตรงกลาง |
|
ทำให้ให้ข้อความยาว 10 ตัวอักษรและข้อความต้นฉบับชิดซ้าย |
|
ทำให้ให้ข้อความยาว 10 ตัวอักษรและข้อความต้นฉบับชิดขวา |
|
นับจำนวนข้อความ |
|
หาตำแหน่งของ |
|
หาตำแหน่งของ |
|
รวมข้อความใน list แล้วคั่นด้วย s เช่น |
|
ข้อความ |
|
ข้อความ |
|
ข้อความ |
|
ข้อความ |
|
ข้อความ |
4.20. ฟังก์ชันในการเพิ่มสมาชิกใน list¶
a = [1, 2, 3, 4]
a.append(5)
print(a) # [1, 2, 3, 4, 5]
การเขียนคำสั่งเพื่อรับ ตัวเลขจากผู้ใช้ 5 ตัวเลข เพื่อเก็บไว้ใน
list
a = []
for i in range(5):
n = int(input())
a.append(n)
print(a)
การเขียนคำสั่งเพื่อรับข้อความตามจำนวนบรรทัดที่ผู้ใช้ระบุมาเก็บไว้ใน
list
a = []
n = int(input('ระบุจำนวนบรรทัดที่จะกรอก: '))
for i in range(n):
line = input()
a.append(line)
print(a)
4.21. ตัวอย่างการเขียนโปรแกรมเพื่อหาหลักสูตรที่มีเกรดเฉลี่ยสูงที่สุด¶
โจทย์
มหาวิทยาลัยแห่งหนึ่งต้องการหาหลักสูตรที่มีเกรดเฉลี่ยของนักศึกษาทุกคนในหลักสูตรสูงที่สุด
งานทะเบียนจึงได้รวบรวมเกรดเฉลี่ยของนักศึกษาทุกคนในของทุกหลักสูตรไว้รวมกันโดยข้อมูลของแต่ละหลักสูตรจะอยู่ใน
1 บรรทัด
ซึ่งประกอบไปด้วยเกรดเฉลี่ยของนักศึกษาในหลักสูตรทุกคนและเกรดเฉลี่ยแต่ละค่าคั่นด้วย
comma ','
โดยบรรทัดแรกจะเป็นตัวเลขระบุจำนวนหลักสูตรทั้งหมดของมหาวิทยาลัย
จงเขียนโปรแกรมเพื่อหาหลักสูตรที่มีเกรดเฉลี่ยรวมของนักศึกษาสูงที่สุด ผลลัพธ์ของโปรแกรมจะต้องแสดง เกรดเฉลี่ยของหลักสูตรที่สูงที่สุด
ตัวอย่าง Input
3
2.55, 3.40, 3.55, 2.95, 3.00, 3.25
3.25, 2.40, 3.55, 3.95, 3.22, 3.53, 3.20, 3.32
3.45, 3.22, 2.95, 3.95, 2.75, 3.66, 2.99, 3.34
ตัวอย่าง Output
3.3024999999999998
Algorithm
อ่านจำนวนหลักสูตร
nสร้าง
listชื่อall_avgเพื่อเก็บค่าเกรดเฉลี่ยรวมของแต่ละหลักสูตรแต่ละหลักสูตรหาค่าเกรดเฉลี่ยรวม
avg(ทำซ้ำnรอบ)อ่านข้อมูลของหลักสูตรทั้งบรรทัด เป็น
lineแยกข้อมูลใน
lineด้วยตัวอักขระ','เป็นinfoแปลงเกรดเฉลี่ยที่เป็น
strในinfoเป็นfloatแล้วเก็บไว้เพื่อหาค่าเฉลี่ยในlistชื่อgpaหาค่าเฉลี่ยโดยใช้สูตร
avg = sum(gpa)/len(gpa)เก็บค่าเฉลี่ย
avgไว้ในall_avgหาเกรดเฉลี่ยที่มากที่สุด
max(all_avg)พร้อมแสดงผลลัพธ์
Implementation
n = int(input())
all_avg = []
for i in range(n):
line = input()
info = line.split(',')
gpa = []
for e in info:
gpa.append( float(e) )
avg = sum(gpa)/len(gpa)
all_avg.append(avg)
print( max(all_avg) )
EX0403 จงเขียนโปรแกรมเพื่อหาเกรดเฉลี่ยรวมที่น้อยที่สุดของทุกหลักสูตร
EX0404 ถ้าในแต่ละบรรทัดมีชื่อหลักสูตรก่อนเกรดเฉลี่ยของนักศึกษาทุกคนในหลักสูตร จงเขียนโปรแกรมหาชื่อหลักสูตรที่มีเกรดเฉลี่ยรวมสูงที่สุด
ตัวอย่าง Input
3
Biology, 2.55, 3.40, 3.55, 2.95, 3.00, 3.25
Computer Science, 3.25, 2.40, 3.55, 3.95, 3.22, 3.53, 3.20, 3.32
Business Administration, 3.45, 3.22, 2.95, 3.95, 2.75, 3.66, 2.99, 3.34
ตัวอย่าง Output
Computer Science
hint list มีฟังก์ชัน sort() สำหรับ
เรียงลำดับข้อมูลจากน้อยไปมาก
a = [ [2,'A'], [1,'B'], [3,'C'] ]
a.sort()
print(a) # [ [1,'B'], [2,'A'], [3,'C'] ]
4.22. Multi-line string - ข้อความหลายบรรทัด¶
a = """ข้อความหลายบรรทัด
แต่ละบรรทัดจะแยกด้วย อักขระ \n
ซึ่งเรียกว่า newline character
"""
print('''ข้อความหลายบรรทัด
แต่ละบรรทัดจะแยกด้วย อักขระ \n
เรียกว่า newline character
''')
4.23. ไฟล์ข้อมูล (File)¶
file เก็บข้อมูลเป็นลำดับไว้ในหน่วยความจำสำรอง โดยลำดับข้อมูลนั้นมีหลายประเภท แต่โดยส่วนใหญ่แล้วจะเป็นไฟล์ที่เก็บข้อความ (text file) นั่นคือเก็บลำดับของอักขระนั่นเอง
file เก็บข้อความแบบ multi-line string โดยมี
'\n'แยกบรรทัด เช่น
line one
line two
line four
เก็บใน text file เป็น
line one\\nline two\\n\\nline four
4.24. การอ่านข้อความจากไฟล์ (reading from text file)¶
การอ่านทุกบรรทัดเป็นหนึ่งข้อความ (multi-line string)
f = open('data.txt', 'r')
all_text = f.read()
print(all_text)
f.close()
การอ่านทีละบรรทัดออกมาเป็น
list
f = open('data.txt', 'r')
lines = f.readlines()
print(lines)
f.close()
การอ่านเพื่อประมวลผลทีละบรรทัด
f = open('data.txt', 'r')
for line in f:
print(line)
f.close()
4.25. การเขียนข้อความลงไฟล์ (writing to text file)¶
การเขียนข้อความ multi-line string ลงไฟล์
lines = """3
Biology, 2.55, 3.40, 3.55, 2.95, 3.00, 3.25
Computer Science, 3.25, 2.40, 3.55, 3.95, 3.22, 3.53, 3.20, 3.32
Business Administration, 3.45, 3.22, 2.95, 3.95, 2.75, 3.66, 2.99, 3.34
"""
f = open('gpa_data.txt', 'w') # open in writing mode
f.write(lines)
f.close()
การเขียน
listของข้อความลงไฟล์
lines = [
'3',
'Biology, 2.55, 3.40, 3.55, 2.95, 3.00, 3.25',
'Computer Science, 3.25, 2.40, 3.55, 3.95, 3.22, 3.53, 3.20, 3.32',
'Business Administration, 3.45, 3.22, 2.95, 3.95, 2.75, 3.66, 2.99, 3.34'
]
f = open('gpa_data.txt', 'w') # open in writing mode
f.writelines(lines)
f.close()
การเชื่อม
listของข้อความเป็น multi-line string เพื่อเขียนลงไฟล์
lines = [
'3',
'Biology, 2.55, 3.40, 3.55, 2.95, 3.00, 3.25',
'Computer Science, 3.25, 2.40, 3.55, 3.95, 3.22, 3.53, 3.20, 3.32',
'Business Administration, 3.45, 3.22, 2.95, 3.95, 2.75, 3.66, 2.99, 3.34'
]
f = open('gpa_data.txt', 'w') # open in writing mode
f.write( '\n'.join(lines) )
f.close()
EX0405 งานทะเบียนของมหาวิทยาลัยเก็บชื่อหลักสูตรและเกรดเฉลี่ยรายบุคคลไว้ในไฟล์ชื่อ 'gpa_data.txt' ตามรูปแบบที่กำหนดในตัวอย่าง input ด้านล่าง จงเขียนโปรแกรมแสดงรายชื่อหลักสูตรโดยเรียงจากหลักสูตรที่มีเกรดเฉลี่ยรวมต่ำสุดไปหาหลักสูตรที่มีเกรดเฉลี่ยรวมสูงสุด
ตัวอย่าง Input ไฟล์ ``gpa_data.txt``
3
Biology, 2.55, 3.40, 3.55, 2.95, 3.00, 3.25
Computer Science, 3.25, 2.40, 3.55, 3.95, 3.22, 3.53, 3.20, 3.32
Business Administration, 3.45, 3.22, 2.95, 3.95, 2.75, 3.66, 2.99, 3.34
ตัวอย่าง Output
Biology
Business Administration
Computer Science
