Python Tuple vs List: ความเหมือนและความแตกต่างอธิบาย
เผยแพร่แล้ว: 2022-08-08ในคู่มือนี้ คุณจะได้เรียนรู้ความ เหมือน และ ความแตกต่าง ระหว่างสิ่ง อันดับ ของ Python และ รายการ คุณจะเข้าใจด้วยว่าเมื่อใดควรใช้ทูเพิล
List และ tuples เป็นโครงสร้างข้อมูลในตัวใน Python สามารถใช้เพื่อเก็บชุดขององค์ประกอบ
ตั้งแต่การสนับสนุนสำหรับการทำดัชนีและการแบ่งส่วนไปจนถึงการมีชนิดข้อมูลที่ต่างกัน ทูเพิลและรายการอาจดูเหมือนมีฟังก์ชันการทำงานที่คล้ายคลึงกัน ดังนั้น การทำความเข้าใจความเหมือนและความแตกต่างระหว่างทั้งสองจะช่วยให้คุณตัดสินใจได้ว่าจะใช้โครงสร้างข้อมูลใด
เอาล่ะ.
คุณสามารถเริ่ม Python REPL และทำตามบทช่วยสอนนี้ คุณยังสามารถใช้โปรแกรมแก้ไข Python ออนไลน์ของ Geekflare เพื่อเขียนโค้ดได้
Python Tuple vs List: ความคล้ายคลึงกันคืออะไร?
เริ่มต้นด้วยการเรียนรู้ความคล้ายคลึงกันระหว่างรายการและทูเพิล เพื่ออำนวยความสะดวกในการเรียนรู้ที่ดียิ่งขึ้น เรานำเสนอตัวอย่างทั้งรายการและทูเพิล

#1 . Python Iterables
ใน Python รายการจะอยู่ในวงเล็บเหลี่ยม ในขณะที่ tuples อยู่ในวงเล็บ คุณยังสามารถสร้างทูเพิลเป็นชุดของค่าที่คั่นด้วยเครื่องหมายจุลภาคโดยไม่ต้องใส่วงเล็บ
พวกเขาทั้งสอง iterables; เพื่อให้คุณสามารถวนซ้ำได้โดยใช้ for loop
เซลล์รหัสด้านล่างแสดงวิธีการวนซ้ำผ่านรายการ
nums = [2,6,7,10] print(f"Type of nums is {type(nums)}") for num in nums: print(num) # Output Type of nums is <class 'list'> 2 6 7 10ตามที่อธิบายไว้ด้านล่าง คุณยังสามารถวนซ้ำผ่านทูเพิลโดยใช้ลูป
nums = (2,6,7,10) # Note: nums = 2,6,7,10 is a valid tuple as well. If needed, run a quick check! print(f"Type of nums is {type(nums)}") for num in nums: print(num) # Output Type of nums is <class 'tuple'> 2 6 7 10#2 . รองรับการสร้างสรรค์จากลำดับอื่นๆ
ความคล้ายคลึงกันถัดไประหว่างรายการและทูเพิลคือสามารถสร้างได้จากลำดับที่มีอยู่ เช่น สตริง
sample_str = "Coding!" เซลล์รหัสต่อไปนี้แสดงวิธีที่ list(string) ส่งกลับรายการ ซึ่งมีรายการเป็นอักขระในสตริง
list_from_str = list(sample_str) print(list_from_str) # Output ['C', 'o', 'd', 'i', 'n', 'g', '!'] ในทำนองเดียวกัน ทูเพิลสามารถสร้างขึ้นจากสตริงหรือลำดับอื่นๆ โดยใช้ tuple(sequence) เซลล์รหัสด้านล่างแสดงวิธีการดำเนินการ
tuple_from_str = tuple(sample_str) print(tuple_from_str) # Output ('C', 'o', 'd', 'i', 'n', 'g', '!')#3 . รองรับการจัดทำดัชนีและการแบ่งส่วน
Python รองรับการสร้างดัชนีศูนย์โดยที่องค์ประกอบแรกอยู่ที่ดัชนีศูนย์ ตัวที่สองอยู่ที่ดัชนีหนึ่ง และอื่นๆ Python ยังรองรับการจัดทำดัชนีเชิงลบ โดยที่องค์ประกอบสุดท้ายอยู่ที่ดัชนี -1 องค์ประกอบรองสุดท้ายอยู่ที่ดัชนี -2 เป็นต้น
list_from_str = ['C', 'o', 'd', 'i', 'n', 'g', '!'] print(list_from_str[1]) # oรายการที่ดัชนี -2 เป็นรายการที่สองต่อท้าย 'g'
tuple_from_str = ('C', 'o', 'd', 'i', 'n', 'g', '!') print(tuple_from_str[-2]) # gคุณสามารถใช้การแบ่งส่วนเมื่อคุณต้องการทำงานกับส่วนเล็กๆ ของรายการหรือทูเพิล list[start:end] ส่งคืนส่วนของรายการโดยเริ่มต้นที่ดัชนีเริ่มต้นและขยายจนถึงจุดสิ้นสุด – 1 ค่าเริ่มต้นสำหรับการเริ่มต้นคือ 0 และจุดสิ้นสุดคือองค์ประกอบสุดท้ายใน iterable
คุณสามารถสไลซ์ทูเพิลได้โดยใช้ไวยากรณ์เดียวกัน มาสร้างสไลซ์ของรายการและทูเพิลที่เราสร้างไว้ก่อนหน้านี้กัน
list_from_str = ['C', 'o', 'd', 'i', 'n', 'g', '!'] print(list_from_str[0:5]) ['C', 'o', 'd', 'i', 'n'] นอกจากค่าเริ่มต้นและสิ้นสุดแล้ว คุณยังสามารถระบุค่าขั้นตอนได้อีกด้วย tuple(start:end:step) คืนค่าสไลซ์ของ tuple ตั้งแต่ start ถึง end - 1 ในขั้นตอนของ step
tuple_from_str = ('C', 'o', 'd', 'i', 'n', 'g', '!') print(tuple_from_str[::2]) ('C', 'd', 'n', '!')ที่นี่เราตั้งค่าขั้นตอนเป็น 2 ดังนั้นสไลซ์จะมีองค์ประกอบทุกวินาที
#4 . การรวบรวมข้อมูลหลายประเภท
ในตัวอย่างที่เราพิจารณา รายการทั้งหมดในรายการและทูเพิลมีประเภทข้อมูลเดียวกัน
อย่างไรก็ตาม คุณสามารถจัดเก็บค่าของประเภทข้อมูลต่างๆ ไว้ในรายการเดียวหรือทูเพิลได้
ข้อมูลโค้ดด้านล่าง student_list มีชื่อนักเรียนเป็นสตริง อายุเป็นจำนวนเต็ม และทำเครื่องหมายเป็นทศนิยม
student_list = ["John",22,96.5] for item in student_list: print(f"{item} is of type {type(item)}") # Output John is of type <class 'str'> 22 is of type <class 'int'> 96.5 is of type <class 'float'>เราสามารถคิดตัวอย่างที่คล้ายกันสำหรับทูเพิลได้
student_tuple = ("Jane",23,99.5) for item in student_tuple: print(f"{item} is of type {type(item)}") # Output Jane is of type <class 'str'> 23 is of type <class 'int'> 99.5 is of type <class 'float'>#5 . รองรับการทดสอบสมาชิก
ทั้ง list และ tuples อนุญาตให้คุณทำการทดสอบความเป็นสมาชิกสำหรับการมีอยู่ของบางรายการ หากคุณต้องการตรวจสอบว่ามีรายการใดอยู่ในรายการหรือทูเพิล คุณสามารถใช้ตัวดำเนินการ in
item in iterableจะประเมินเป็นTrueหากiterableมีitemนั้น อย่างอื่นFalse
"Alex" in student_list # False "Jane" in student_tuple # Trueจนถึงตอนนี้ คุณได้เรียนรู้ความคล้ายคลึงกันระหว่างรายการและสิ่งอันดับใน Python ต่อไป มาเรียนรู้ความแตกต่างที่สำคัญระหว่างโครงสร้างข้อมูลทั้งสอง
Python Tuple กับรายการ: อะไรคือความแตกต่าง?
#1 . ความไม่แน่นอนของรายการและความไม่เปลี่ยนรูปของทูเปิลใน Python
ความแตกต่างที่สำคัญที่สุดระหว่าง list และ tuple ใน Python ก็คือ tuple นั้น ไม่เปลี่ยนรูป ซึ่งหมายความว่าคุณ ไม่สามารถ แก้ไข tuple ได้
️นี่คือตัวอย่าง
tuple1 = ("Java","Python","C++") tuple1[0] = "Rust" # Output ----> 2 tuple1[0] = "Rust" TypeError: 'tuple' object does not support item assignmentรายการเป็นโครงสร้างข้อมูลที่เปลี่ยนแปลงได้ ดังนั้นเราจึงสามารถแก้ไขรายการโดยการเปลี่ยนรายการที่ดัชนีเฉพาะ เช่นเดียวกับในเซลล์รหัสต่อไปนี้
list1 = ["Java","Python","C++"] list1[0] = "Rust" print(list1) # Output ['Rust', 'Python', 'C++']#2 . รายการความยาวตัวแปรเทียบกับทูเพิลความยาวคงที่
รายการ Python เป็นโครงสร้างข้อมูลที่มีความยาวผันแปรได้
คุณสามารถทำสิ่งต่อไปนี้:
- เพิ่มรายการต่อท้ายรายการ
- เพิ่มรายการจากรายการอื่นที่ส่วนท้ายของรายการปัจจุบัน
- ลบรายการที่ดัชนีเฉพาะออกจากรายการ
list1 = [2,3,4,5] # add an item to the end list1.append(9) print(list1) # add items from list2 to the end of list1 list2 = [0,7] list1.extend(list2) print(list1) # remove an item from list1 list1.pop(0) print(list1)️ ผลลัพธ์ของข้อมูลโค้ดด้านบน

# Output [2, 3, 4, 5, 9] [2, 3, 4, 5, 9, 0, 7] [3, 4, 5, 9, 0, 7]Tuples เป็นโครงสร้างข้อมูลที่มีความยาวคงที่ ดังนั้นคุณจึงไม่สามารถเพิ่มหรือลบองค์ประกอบออกจาก tuple ที่มีอยู่ได้ แต่คุณสามารถกำหนด tuple ใหม่เพื่อให้มีองค์ประกอบต่างๆ ได้
tuple1 = (2,4,6,8) tuple1 = (1,8,9) print(tuple1) # Output (1, 8, 9)#3 . ขนาดในหน่วยความจำ
ตอนนี้เราจะสร้างจากสิ่งที่เราได้เรียนรู้ในส่วนก่อนหน้านี้: รายการ นี้เป็นโครงสร้างข้อมูลที่ มีความยาวผันแปร ได้
เมื่อคุณกำหนดรายการในขั้นต้น จะมีการจัดสรรขนาดเฉพาะสำหรับรายการนั้นในหน่วยความจำ ตอนนี้ เมื่อคุณแก้ไขรายการโดยใช้เมธอด append() หรือ extend() ควรจัดสรรหน่วยความจำเพิ่มเติมเพื่อจัดเก็บองค์ประกอบที่เพิ่มเข้ามา การจัดสรรนี้ทำได้มากกว่าจำนวนรายการที่คุณเพิ่มเกือบทุกครั้ง
ดังนั้นจึงจำเป็นต้องติดตามจำนวนรายการในรายการและพื้นที่ที่จัดสรร นอกจากนี้ เนื่องจากรายการมีความยาวผันแปรได้ มีตัวชี้ที่ชี้ไปยังที่อยู่ของรายการ ด้วยเหตุนี้ รายการความยาว k จึงใช้หน่วยความจำมากกว่าทูเพิลที่มีองค์ประกอบ k เหมือนกัน
นี่เป็นภาพประกอบง่ายๆ

คุณสามารถใช้ getsizeof() ของโมดูล sys ในตัวบนอ็อบเจ็กต์ Python เพื่อรับขนาดของอ็อบเจ็กต์ในหน่วยความจำ
import sys list1 = [4,5,9,14] list_size = sys.getsizeof(list1) print(f"Size of list:{list_size}") tuple1 = (4,5,9,14) tuple_size = sys.getsizeof(tuple1) print(f"Size of tuple:{tuple_size}")รายการใช้หน่วยความจำมากกว่าทูเพิลสำหรับจำนวนและค่าขององค์ประกอบเดียวกัน ตามที่ตรวจสอบแล้วในผลลัพธ์ด้านล่าง
# Output Size of list:104 Size of tuple:88 
คุณควรใช้ Python Tuple เมื่อใด
จากความแตกต่างและความคล้ายคลึงกันระหว่างรายการ Python และ tuples คุณทราบดีว่าหากคุณต้องการคอลเลกชัน ที่ไม่แน่นอน คุณควรใช้ list
แต่คุณควรใช้ tuple แทนเมื่อใด
เราจะพูดถึงเรื่องนี้ในส่วนนี้
#1 . คอลเลคชันแบบอ่านอย่างเดียว
เมื่อใดก็ตามที่คุณต้องการให้คอลเลกชันไม่เปลี่ยนรูป คุณควรกำหนดให้เป็นทูเพิล สมมติว่า color = (243,55,103) ทูเพิลที่มีค่า RGB ที่สอดคล้องกับเฉดสี การกำหนดสีเป็นทูเพิลช่วยให้แน่ใจว่าสีจะไม่สามารถแก้ไขได้
โดยพื้นฐานแล้ว เมื่อคุณต้องการให้คอลเลกชันเป็นแบบอ่านอย่างเดียว: ค่าต่างๆ ไม่ควรแก้ไขระหว่างโปรแกรม คุณควรพิจารณาใช้ tuple ซึ่งจะช่วยป้องกันการปรับเปลี่ยนค่าโดยไม่ได้ตั้งใจ
#2 . คีย์พจนานุกรม
ตัวอย่างเช่น คุณสร้างพจนานุกรมโดยใช้รายการ key_list เป็นคีย์ คุณสามารถใช้ dict.fromkeys() เพื่อสร้างพจนานุกรมจากรายการ
key_list = list("ABCD") dict.fromkeys(key_list) {'A': None, 'B': None, 'C': None, 'D': None}สมมติว่าคุณแก้ไขรายการให้มี 'D' เป็นองค์ประกอบแรก (ดัชนี 0)— ก่อน สร้างพจนานุกรม
ทีนี้ จะเกิดอะไรขึ้นกับคีย์พจนานุกรม 'A'
หากคุณพยายามสร้างพจนานุกรมจาก key_list และเข้าถึงค่าที่ตรงกับคีย์ 'A' คุณจะพบกับ KeyError
key_list[0] = 'D' dict.fromkeys(key_list)['A'] --------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-31-c90392acc2cf> in <module>() ----> 1 dict.fromkeys(key_list)['A'] KeyError: 'A'คีย์ของพจนานุกรมควรไม่ซ้ำกัน ดังนั้นคุณจึงไม่สามารถมี 'D' ตัวที่สองเป็นคีย์ได้
dict.fromkeys(key_list) {'B': None, 'C': None, 'D': None} # A is no longer a key.หากคุณใช้ทูเพิลแทน การปรับเปลี่ยนดังกล่าวเป็นไปไม่ได้ และคุณมีโอกาสเกิดข้อผิดพลาดน้อยลง ดังนั้น คุณควรสร้างพจนานุกรมโดยใช้รายการของทูเพิลเป็นคีย์
key_tuple = tuple("ABCD") dict.fromkeys(key_tuple) {'A': None, 'B': None, 'C': None, 'D': None} key_tuple[0] = 'D' --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-12-2cecbefa7db2> in <module>() ----> 1 key_tuple[0] = 'D' TypeError: 'tuple' object does not support item assignment#3 . อาร์กิวเมนต์ของฟังก์ชัน
ความไม่เปลี่ยนรูปของทูเพิลยังทำให้เหมาะสมที่จะส่งผ่านเป็นอาร์กิวเมนต์ของฟังก์ชัน
พิจารณาฟังก์ชัน find_volume() ต่อไปนี้ที่คืนค่าปริมาตรของลูกบาศก์ตามขนาด: ความยาว ความกว้าง และความสูง
def find_volume(dimensions): l,b,h = dimensions return l*b*h สมมติว่ามิติข้อมูลเหล่านี้มีอยู่ในรายการที่เรียกว่าได dimensions การเรียก find_volume() ที่มี dimensions เป็นอาร์กิวเมนต์ส่งกลับปริมาณ
dimensions = [2,8,5] find_volume(dimensions) 80คุณสามารถเปลี่ยนขนาดที่จัดเก็บไว้ในรายการได้ตลอดเวลา
dimensions = [20,8,5] find_volume(dimensions) 800อย่างไรก็ตาม บางครั้งคุณจำเป็นต้องให้ค่าคงที่และไม่เปลี่ยนแปลง นั่นคือเวลาที่คุณควรพิจารณาจัดเก็บอาร์กิวเมนต์เป็นทูเพิลและนำไปใช้ในการเรียกใช้ฟังก์ชัน
#4 . ส่งคืนค่าจากฟังก์ชัน
ใน Python คุณจะเจอ tuples ในการคืนค่าจากฟังก์ชัน เมื่อคุณคืนค่าหลายค่าจากฟังก์ชันหนึ่งๆ Python จะคืนค่าเป็น tuple โดยปริยาย
พิจารณาฟังก์ชัน return_even() ต่อไปนี้:
def return_even(num): even = [i for i in range(num) if (i%2==0)] return even,len(even)- ใช้ตัวเลขเป็น
num - ส่งคืนรายการตัวเลขคู่ในช่วง
[0,num)และความยาวของรายการนั้น
มาตั้งค่าของ num 20 และเรียกใช้ฟังก์ชันกัน
num = 20 การเรียก return_even() จะคืนค่าทั้งสองค่าในทูเพิล คุณสามารถเรียกใช้ฟังก์ชัน type() โดยมีการเรียกใช้ฟังก์ชันเป็นอาร์กิวเมนต์การตรวจสอบ
type(return_even(num)) # <class 'tuple'>คุณสามารถพิมพ์ค่าที่ส่งคืนเพื่อตรวจสอบว่าเป็นทูเพิลที่มีรายการของเลขคู่เป็นรายการแรกและความยาวของรายการเป็นรายการที่สอง
print(return_even(num)) ([0, 2, 4, 6, 8, 10, 12, 14, 16, 18], 10)เนื่องจากมีสองรายการในทูเพิล คุณสามารถแยกรายการออกเป็นสองตัวแปรดังที่แสดงด้านล่าง
even_nums, count = return_even(num) print(even_nums) print(count) [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 10บทสรุป
ฉันหวังว่าบทช่วยสอนนี้จะให้การเปรียบเทียบที่ครอบคลุมของ Python tuple vs list
มาสรุปบทแนะนำด้วยการสรุปโดยย่อ:
- List และ tuples เป็นโครงสร้างข้อมูลในตัวใน Python
- ความคล้ายคลึงกัน : iterables การสนับสนุนสำหรับการสร้างดัชนี การแบ่งส่วน ชนิดข้อมูลที่แตกต่างกัน และตัวดำเนินการสำหรับการทดสอบความเป็นสมาชิก
- ความแตกต่างที่สำคัญ : รายการเปลี่ยนแปลงได้ และทูเพิลไม่เปลี่ยนรูปแบบ
- ความแตกต่างอื่นๆ : ความยาวคงที่ของสิ่งอันดับและความยาวของรายการตัวแปร ขนาดที่เล็กลงในหน่วยความจำของสิ่งอันดับ
- คุณควรใช้ทูเพิลเมื่อใด สำหรับคอลเลกชั่นที่ไม่เปลี่ยนรูป คีย์พจนานุกรม และอาร์กิวเมนต์ของฟังก์ชัน
ต่อไป ตรวจสอบโครงการ Python เพื่อฝึกฝนและเรียนรู้ หรือเรียนรู้วิธีลบรายการที่ซ้ำกันออกจากรายการ Python มีความสุขในการเรียนรู้! ถ้าอย่างนั้น ขอให้สนุกกับการเขียนโค้ด!
