เรียนรู้โครงสร้างข้อมูลรายการ Python - ตอนที่ 1
โครงสร้างข้อมูล คือชุดของประเภทข้อมูล ความสัมพันธ์ระหว่างประเภทข้อมูล และฟังก์ชันหรือการดำเนินการที่สามารถนำไปใช้กับข้อมูลได้ ประเภทข้อมูลอาจเป็น สตริง, จำนวนเต็ม, ค่าลอยตัว และอื่นๆ
อะไรคือความแตกต่างระหว่างวัตถุที่เปลี่ยนแปลงได้/ไม่เปลี่ยนรูป?
วัตถุที่ไม่แน่นอน
- ออบเจ็กต์ที่สามารถเปลี่ยนแปลงสถานะได้เมื่อถูกสร้างขึ้น เช่น การเพิ่ม การอัปเดต หรือการลบองค์ประกอบ
- Lists, Dictionary, Set, bytearray เป็นประเภทอ็อบเจ็กต์ที่ไม่แน่นอนใน Python
วัตถุที่ไม่เปลี่ยนรูป
- สถานะของวัตถุไม่สามารถแก้ไขได้ เมื่อสร้างออบเจ็กต์แล้ว เราไม่สามารถเพิ่ม ลบ หรืออัปเดตองค์ประกอบได้
- String, Integer, Tuples, Frozenset คือออบเจ็กต์บางประเภทที่ไม่เปลี่ยนรูปใน python
อะไรคือความแตกต่างระหว่างโครงสร้างข้อมูลที่เป็นเนื้อเดียวกัน/ต่างกัน?
- โครงสร้างข้อมูลที่เป็นเนื้อเดียวกัน – องค์ประกอบข้อมูลจะเป็นประเภทข้อมูลเดียวกัน (เช่น อาร์เรย์)
- โครงสร้างข้อมูลที่แตกต่างกัน – องค์ประกอบข้อมูลต้องไม่ใช่ประเภทข้อมูลเดียวกัน (เช่น รายการ สิ่งอันดับ เซต ฯลฯ...)
ประเภทข้อมูลดั้งเดิมและไม่ใช่ดั้งเดิมคืออะไร
ก่อนที่จะทำความเข้าใจฟังก์ชันการทำงานของโครงสร้างข้อมูลในตัวให้เราดูฟังก์ชันในตัวบางส่วนที่จะใช้กับออบเจ็กต์โครงสร้างข้อมูล
- dir(obj) – ฟังก์ชันในตัวที่จะส่งคืนแอตทริบิวต์และวิธีการ
- len(obj) – ส่งกลับความยาว (จำนวนรายการ) ของวัตถุ อาร์กิวเมนต์อาจเป็นลำดับ (เช่น สตริง ไบต์ ทูเพิล รายการ หรือช่วง) หรือคอลเลกชัน (เช่น พจนานุกรม เซ็ต หรือเซ็ตที่ตรึง)
- del – คีย์เวิร์ดในตัวนี้ใช้เพื่อลบวัตถุออกจากเนมสเปซหรือลบรายการออกจากวัตถุเช่นรายการ พจนานุกรม ฯลฯ
- type(obj) – ฟังก์ชัน type() จะส่งคืนประเภทของออบเจ็กต์หรือส่งคืนออบเจ็กต์ประเภทใหม่ตามอาร์กิวเมนต์ที่ส่งผ่าน
- id() – ฟังก์ชันนี้ส่งคืน “ตัวตน” ของวัตถุ นี่คือจำนวนเต็มที่รับประกันว่าจะไม่ซ้ำกันและคงที่สำหรับวัตถุนี้ตลอดอายุการใช้งาน
เมื่อคุณได้เห็นรายละเอียดที่สำคัญบางประการแล้ว ให้เราดำเนินการกับโครงสร้างข้อมูลของ Python ต่อไป
Python มาพร้อมกับโครงสร้างข้อมูลในตัว และผู้ใช้สามารถกำหนดโครงสร้างข้อมูลของตนเองได้ โครงสร้างข้อมูลในตัวประกอบด้วย LIST, DICTIONARY, TUPLE และ SET ตัวอย่างบางส่วนสำหรับโครงสร้างข้อมูลที่ผู้ใช้กำหนด ได้แก่ STACK, QUEUES, TREE, HASHMAP ฯลฯ...
คนที่มาจากภาษาโปรแกรมอื่นจะคุ้นเคยกับประเภทอาเรย์เป็นอย่างดี แต่ใน python มันไม่ธรรมดาเลย
ที่นี่รายการจะคล้ายกับอาร์เรย์ แต่รายการช่วยให้เราสามารถเก็บค่าของประเภทข้อมูลใด ๆ (ต่างกัน) ในขณะที่อาร์เรย์จะเก็บข้อมูลประเภทใดประเภทหนึ่งเท่านั้น (int, float ฯลฯ ... ) หากต้องการใช้อาร์เรย์ คุณต้องนำเข้าอาร์เรย์จากโมดูล "อาร์เรย์" อย่างชัดเจน
ในบทความชุด Python นี้ เราจะดูว่า โครงสร้างข้อมูล และ โครงสร้างข้อมูลในตัวของ Python คืออะไร
รายการ
รายการ คือโครงสร้างข้อมูลที่รวบรวมประเภทข้อมูลต่างๆ “การรวบรวมข้อมูลประเภทต่างๆ ” หมายความว่าอย่างไร รายการ สามารถจัดเก็บสตริง จำนวนเต็ม ค่าจุดทศนิยม รายการที่ซ้อนกัน และอื่นๆ
ออบเจ็กต์ รายการ เป็นแบบ “ไม่แน่นอน ” ซึ่งหมายความว่ารายการที่สร้างขึ้นภายในรายการจะสามารถเข้าถึง แก้ไข หรือลบได้ รายการสนับสนุนการจัดทำดัชนี แต่ละรายการในรายการได้รับการกำหนดให้กับที่อยู่ และที่อยู่นั้นสามารถใช้เพื่อเข้าถึงหรือแก้ไขมูลค่าของรายการเฉพาะได้
- สร้างรายการ
- แทรก/เข้าถึง/แก้ไขรายการ
- ลบรายการ
สร้างรายการ
สามารถสร้างรายการได้โดยใช้วงเล็บเหลี่ยม
>>> name_empty = [] # Empty list
>>> name = ['Karthi', 'Leo', 'Matt', 'Kane', 'Scott', 'Petter', 'Will'] # list with string data type
>>> name_int = [1,2,3] # list with Integer data type
>>> name_mixed = [name_int,name,1,2,3.14] # list with nested list items.
>>> name_mixed
[[1, 2, 3], ['Karthi', 'Leo', 'Matt', 'Kane', 'Scott', 'Petter', 'Will'], 1, 2, 3.14]
>>> name_int
[1, 2, 3]
เราสามารถใช้ฟังก์ชัน inbuilt type()
เพื่อตรวจสอบประเภทวัตถุ
>>> type(name)
เราสามารถเข้าถึง วิธีการ และ คุณลักษณะ ของอินสแตนซ์ รายการ โดยใช้ฟังก์ชัน dir()
>>> dir(name)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
เราสามารถหาจำนวนรายการทั้งหมดในรายการได้โดยใช้วิธี len()
>>> len(name)
เราสามารถสร้างรายการใหม่จากรายการที่มีอยู่โดยใช้วิธี list.copy()
>>> name_new = name.copy()
>>> name_new
['Karthi', 'Leo', 'Matt', 'Kane', 'Scott', 'Petter', 'Will']
การแทรก/การเข้าถึง/การแก้ไขรายการ
เราสามารถแทรกรายการลงในรายการในตำแหน่งใดก็ได้โดยใช้วิธี list.insert(i, x)
>>> name = ['Leo','Matt','Kane','Scott','Petter','Will']
>>> name
['Leo', 'Matt', 'Kane', 'Scott', 'Petter', 'Will']
>>> name.insert(0,'Tom') # Insert method takes 2 arguments (Index position, Item)
>>> name
['Tom', 'Leo', 'Matt', 'Kane', 'Scott', 'Petter', 'Will'] # Tom is inserted at the 0th position.
เราสามารถใช้วิธี list.append(x)
เพื่อผนวกรายการเดียวในรายการได้ ซึ่งจะแทรกรายการไปที่ท้ายรายการ
>>> name = []
>>> len(name)
0
>>> name.append('Leo')
>>> name.append('Matt')
>>> name.append('Kane')
>>> print(name)
['Leo', 'Matt', 'Kane']
เราสามารถใช้วิธี list.extend()
เพื่อเพิ่มหลายรายการลงในรายการได้
>>> new_name = ['Gowtham','Martin','Luis']
>>> name.extend(new_name)
>>> name
['Will', 'Petter', 'Scott', 'Kane', 'Matt', 'Leo', 'Karthi', 'Will', 'Gowtham', 'Martin', 'Luis']
นอกจากนี้เรายังสามารถใช้ตัวดำเนินการ '+'
เพื่อรวมสองรายการเข้าด้วยกัน ทั้งสองรายการสามารถเป็นประเภทข้อมูลที่แตกต่างกันได้
>>> a = [1,2,3]
>>> b = [2,3,3]
>>> c = a + b
>>> c
[1, 2, 3, 2, 3, 3]
>>> d = ['karthi','kenny']
>>> e = a + d
>>> e
[1, 2, 3, 'karthi', 'kenny']
ตามที่ระบุไว้แล้ววัตถุรายการไม่แน่นอน รายการสามารถแก้ไขได้โดยการอ้างอิงตำแหน่งดัชนีและกำหนดค่าให้กับรายการนั้น
>>> name # Before modified
['Tom', 'Leo', 'Matt', 'Kane', 'Scott', 'Petter', 'Will']
>>> name[0] = 'Karthi'
>>> name # After Modified
['Karthi', 'Leo', 'Matt', 'Kane', 'Scott', 'Petter', 'Will']
รายการ รองรับการจัดทำดัชนีทั้งเชิงบวกและเชิงลบ
การจัดทำดัชนีเริ่มต้นจาก 0 และการจัดทำดัชนีเชิงลบเริ่มต้นจาก -1
เราสามารถเข้าถึงรายการโดยใช้ตำแหน่งดัชนี
>>> name[0] # Accessing the List item at index 0
'Leo'
>>> name[1]
'Matt'
>>> name[4]
'Petter'
>>> name[5]
'Will'
>>> name[-1] # Accessing the list item with negative indexing
'Will'
>>> name[-6]
'Leo'
เรายังสามารถใช้การแบ่งส่วนเพื่อเข้าถึงรายการในรายการได้ การแบ่งส่วนทำให้เราสามารถเข้าถึงรายการต่างๆ ได้โดยการกำหนดพารามิเตอร์เริ่มต้น สิ้นสุด และขั้นตอน
SYNTAX: list[starting position, ending position, Step]
>>> name[0:3]
['Tom', 'Leo', 'Matt']
>>> name[:]
['Tom', 'Leo', 'Matt', 'Kane', 'Scott', 'Petter', 'Will']
>>> name[:4]
['Tom', 'Leo', 'Matt', 'Kane']
>>> name[:-2]
['Tom', 'Leo', 'Matt', 'Kane', 'Scott']
>>> name[:-1]
['Tom', 'Leo', 'Matt', 'Kane', 'Scott', 'Petter']
>>> name[:-1:2]
['Tom', 'Matt', 'Scott']
เราสามารถหาจำนวนครั้งที่เกิดขึ้นสำหรับค่าที่กำหนดได้โดยใช้วิธี list.count(x)
>>> name_int = [1,1,2,3,1]
>>> name_int.count(1)
3
เราสามารถค้นหาตำแหน่งดัชนีของรายการที่กำหนดโดยใช้วิธี list.index(x[, start[, end]])
>>> name # Inserted ‘Will’ at the end of the list. Now we have 2 name ‘Will’.
['Will', 'Petter', 'Scott', 'Kane', 'Matt', 'Leo', 'Karthi', 'Will']
>>> name.index('Will) # Returns the index position of first occurence of x.
0
>>> name.index('Will',2) # Starting index positon’2’ is given.
7
>>> name.index('Will',2,4) # Starting and Ending Index position is given. Since there is no occurence of ‘Will’ within the given search position it will throw Value Error.
Traceback (most recent call last):
File "<stdin>", line 1, in
ValueError: 'Will' is not in list
เราสามารถใช้วิธี list.reverse()
เพื่อย้อนกลับรายการในรายการ
>>> name
['Karthi', 'Leo', 'Matt', 'Kane', 'Scott', 'Petter', 'Will']
>>> name.reverse()
>>> name
['Will', 'Petter', 'Scott', 'Kane', 'Matt', 'Leo', 'Karthi']
ลบรายการ
เราสามารถใช้วิธี list.pop(x)
เพื่อลบรายการออกจากรายการที่ตำแหน่ง x
ฟังก์ชั่นนี้จะลบรายการออกจากรายการและแสดงรายการที่ถูกลบ หากไม่ได้ระบุ x
วิธีการ pop()
จะส่งคืนรายการสุดท้ายจากรายการ
>>> name
['Will', 'Petter', 'Scott', 'Kane', 'Matt', 'Leo', 'Karthi', 'Will', 'Gowtham', 'Martin', 'Luis']
>>> name.pop(0)
'Will'
>>> name
['Petter', 'Scott', 'Kane', 'Matt', 'Leo', 'Karthi', 'Will', 'Gowtham', 'Martin', 'Luis']
>>> name.pop()
'Luis'
นอกจากนี้เรายังสามารถใช้วิธี list.remove (x)
เพื่อลบรายการออกจากรายการ ที่นี่ x
รับค่าของรายการและส่ง ValueError หาก x
ไม่อยู่ในรายการ
>>> name = ['Leo','Matt','Kane','Scott','Petter','Will']
>>> name.remove('Leo')
>>> name
['Matt', 'Kane', 'Scott', 'Petter', 'Will']
>>> name.remove('Leo')
Traceback (most recent call last):
File "", line 1, in
ValueError: list.remove(x): x not in list
เราสามารถสร้างรายการว่างได้โดยการกำหนดชื่อรายการให้กับวงเล็บเหลี่ยมหรือใช้วิธี list.clear()
>>> name1 = name.copy()
>>> name1
['Petter', 'Scott', 'Kane', 'Matt', 'Leo', 'Karthi', 'Will', 'Gowtham', 'Martin']
>>> name
['Petter', 'Scott', 'Kane', 'Matt', 'Leo', 'Karthi', 'Will', 'Gowtham', 'Martin']
>>> name = []
>>> name
[]
>>> name1.clear()
>>> name1
[]
แทนที่จะใช้วิธีการรายการเพื่อทำให้รายการว่างเปล่าหรือลบรายการออกจากรายการ เราสามารถใช้คำหลัก del
ในตัวเพื่อดำเนินการนี้ได้ คีย์เวิร์ด “del” สามารถลบวัตถุรายการออกจากหน่วยความจำหรือลบรายการออกจากรายการหรือลบรายการออกจากชิ้น
>>> name = ['Leo','Matt','Kane','Scott','Petter','Will']
>>> del name[0]
>>> name
['Matt', 'Kane', 'Scott', 'Petter', 'Will']
>>> del name[-3:]
>>> name
['Matt', 'Kane']
>>> del name[:]
>>> name
[]
ฟังก์ชัน id()
ในตัวจะส่งคืน “ตัวตน ” ของออบเจ็กต์ นี่คือจำนวนเต็มซึ่งรับประกันว่าจะไม่ซ้ำกันและคงที่สำหรับวัตถุนี้ตลอดอายุการใช้งาน
>>> id(name)
139979929658824
>>> del name
>>> id(name)
Traceback (most recent call last):
File "", line 1, in
NameError: name 'name' is not defined
หมายเหตุ: เราได้ลบตัวแปรรายการออกจากหน่วยความจำโดยใช้ del()
ดังนั้นจึงทำให้เกิดข้อผิดพลาดเกี่ยวกับชื่อ
help() funtion:
ความช่วยเหลือในตัว function()
มีประโยชน์มากในการดูรายละเอียดเกี่ยวกับวัตถุเฉพาะหรือวิธีการของวัตถุนั้น
help(object)
help(object.method)
สรุป
จนถึงตอนนี้ในบทความนี้ เราได้เห็นวิธีที่เราสามารถใช้ โครงสร้างข้อมูลรายการ เพื่อจัดเก็บ เข้าถึง แก้ไข ลบวัตถุรายการโดยใช้วิธีการรายการ นอกจากนี้เรายังได้เห็นฟังก์ชันในตัวเช่น id(), dir(), type(), help()< ซึ่งเป็นฟังก์ชันที่มีประสิทธิภาพมาก นอกจากนี้เรายังมีความเข้าใจรายการใน python ซึ่งช่วยให้สร้างรายการได้กระชับและอ่านง่ายยิ่งขึ้น