โมดูลคอลเลกชัน Python: ตัวนับ, ChainMap, Deque & Tuple

เผยแพร่แล้ว: 2020-12-01

โมดูล Python Collections นำเสนอชุดของประเภทข้อมูลคอนเทนเนอร์ที่ขยายคุณสมบัติของคอนเทนเนอร์สต็อก เช่น รายการ ทูเปิล ชุด และพจนานุกรม ด้วยคอนเทนเนอร์พิเศษเหล่านี้ คุณไม่เพียงแต่มีคุณสมบัติของคอนเทนเนอร์สต็อกเท่านั้น แต่ยังมีวิธีการพิเศษบางอย่างที่มีประโยชน์มากสำหรับงานบางอย่าง

ในตอนท้ายของบทช่วยสอนนี้ คุณจะมีความรู้ดังต่อไปนี้:

  • โมดูลคอลเลกชันคืออะไร?
  • ฟังก์ชั่นต่างๆเช่น:
  1. เคาน์เตอร์
  2. ChainMap
  3. เดเก
  4. ชื่อทูเปิล
  • ตัวอย่างการทำงาน

โมดูล Collections ติดตั้งมาล่วงหน้าใน Python ดังนั้นเราจึงไม่จำเป็นต้องติดตั้ง pip เราสามารถนำเข้าได้และคุณพร้อมที่จะไป! มาดูฟังก์ชั่นที่ใช้บ่อยที่สุดในแบบละเอียดกัน

เรียนรู้ การเรียนรู้วิทยาศาสตร์ข้อมูล จากมหาวิทยาลัยชั้นนำของโลก รับโปรแกรม PG สำหรับผู้บริหาร โปรแกรมประกาศนียบัตรขั้นสูง หรือโปรแกรมปริญญาโท เพื่อติดตามอาชีพของคุณอย่างรวดเร็ว

ต้องอ่าน: แอปพลิเคชั่น Python ที่น่าสนใจในโลกแห่งความจริง

สารบัญ

เคาน์เตอร์

ตัว นับ เป็นฟังก์ชันที่ใช้งานได้ง่ายและมีประโยชน์มากที่สุดในโมดูลคอลเลกชัน Counter เป็นคลาสย่อยของคลาสพจนานุกรมใน Python โดยจะนับจำนวนการเกิดขึ้นของแต่ละองค์ประกอบใน iterable (เช่น strings, tuples, list ฯลฯ) และจัดเก็บไว้ในพจนานุกรม ปุ่มพจนานุกรมเป็นองค์ประกอบเฉพาะใน iterable และค่าคือการนับขององค์ประกอบเหล่านั้น

มาลองใช้ตัวอย่างกัน

นำเข้าคอลเลกชัน
Marvel = 'Bad Wolverine รังแก Iron Man ที่น่าสงสาร Bad Wolverine Iron Man ที่น่าสงสาร'
Marvel_count = collections.Counter(Marvel.split())

#ผลลัพธ์:
ตัว นับ({ 'แย่' : 3 ,
'เหล็ก' : 2 ,
'ผู้ชาย' : 2 ,
'แย่' : 2 ,
'วูล์ฟเวอรีน' : 2 ,
'ถูกรังแก' : 1 })

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

Marvel_count[ 'แย่' ]
#>> 3

Marvel_count.values()
#>> dict_values([3, 2, 1, 2, 2, 2])

Marvel_count.keys()
#>> dict_keys(['Bad', 'Wolverine', 'bullied', 'Iron', 'Man', 'Poor'])

Most_common(n) วิธีการส่งกลับรายการของ n องค์ประกอบที่พบบ่อยที่สุดที่จัดเรียงตามลำดับการนับจากมากไปน้อย

Marvel_count.most_common( 2 )
#>> [('แย่', 3), ('วูล์ฟเวอรีน', 2)]

ChainMap

ChainMap ใช้เพื่อสร้างมุมมองเดียวของพจนานุกรมจำนวนมาก เพื่อให้สามารถเข้าถึงและอัปเดตได้จากมุมมองเดียว เช่น วัตถุ ChainMap โปรดทราบว่า ChainMaps เหล่านี้ประกอบด้วยการอ้างอิงถึงพจนานุกรมจริงเท่านั้น และการอัปเดตจะทำในพจนานุกรมจริงด้วย

ChainMap เป็นส่วนขยายของคลาสพจนานุกรม ดังนั้นจึงรองรับวิธีพจนานุกรมทั้งหมด บวกกับวิธีการพิเศษสองสามวิธีที่เราจะพูดถึงต่อไป

dic1 = { 'a' : 1 , 'b' : 2 }
dic2 = { 'b' : 3 , 'c' : 4 } Dic3 = { 'b' : 9 , 'd' : 4 }
chain1 = คอลเล็กชัน ChainMap (dic2, dic1)
ห่วงโซ่1

ในโค้ดด้านบนนี้ เรากำหนดพจนานุกรมสองชุด dic1 และ dic2 และใส่ไว้ในอ็อบเจ็กต์ ChainMap

#ผลลัพธ์:
ChainMap({ 'b' : 3 , 'c' : 4 }, { 'a' : 1 , 'b' : 2 })

ดังที่เราเห็น dic2 ถูก 'ล่ามโซ่' กับ dic1 ตามลำดับนี้ โดยพื้นฐานแล้ว คุณสามารถจินตนาการได้ว่า dic2 เชื่อมต่อกับ dic1 เช่น dic2–>dic1 ดังนั้นเมื่อเราค้นหาคีย์ 'b' อันดับแรกจะค้นหาในการแมปแรกซึ่งก็คือ dic2 และหากไม่พบคีย์ คีย์ดังกล่าวจะไปยังการแมปถัดไป

ดังนั้น ลำดับของ ChainMap จึงมีความสำคัญในการพิจารณาว่าแผนที่ใดจะถูกค้นหาก่อน มาดูกันว่าในการดำเนินการ

ห่วงโซ่1[ 'b' ]
#>> 3

ดังที่เราเห็นว่าด้านบน ChainMap มีคีย์ 'b' ในพจนานุกรมทั้งสอง ดังนั้นเมื่อเราค้นหาคีย์ 'b' มันจะค้นหาในการแมปแรกซึ่งก็คือ dic2 และคืนค่ากลับ

แผนที่แอตทริบิวต์

แอตทริบิวต์แผนที่ ChainMap ส่งคืนรายการการแมปตามลำดับการค้นหา กล่าวคือ dic2 เป็นอันดับแรกในแผนที่ ดังนั้นจะมีการค้นหาก่อนเป็นต้น

chain1.maps
#>> [{'b': 3, 'c': 4}, {'a': 1, 'b': 2}]

ในทำนองเดียวกัน เราสามารถตรวจสอบคีย์และค่าต่างๆ ได้:

รายการ (chain1.keys())
#>> ['a', 'c', 'b']

รายการ (chain1.values())
#>> [1, 4, 3]

ดังที่เราเห็น เฉพาะคีย์ที่ไม่ซ้ำเท่านั้นที่จะแสดงและค่าต่างๆ ด้วย

new_child(ม=ไม่มี)

วิธีการ new_child() ใช้สำหรับเพิ่มแผนที่ใหม่ลงใน ChainMap เมธอดนี้ส่งคืน ChainMap ใหม่พร้อมแผนที่ใหม่เป็นแผนที่แรกตามด้วยแผนที่ที่เหลือ หากระบุ m ไว้ มันจะกลายเป็นแผนที่แรก มิฉะนั้น พจนานุกรมที่ว่างเปล่าจะถูกเพิ่มเป็นแผนที่แรก

chain1.new_child(dic3)
chain1.maps

#ผลลัพธ์:
[{ 'b' : 9 , 'd' : 4 }, { 'b' : 3 , 'c' : 4 }, { 'a' : 1 , 'b' : 2 }]

อย่างที่เราเห็น มันเพิ่ม dic3 ในตอนเริ่มต้นและส่งคืนอ็อบเจ็กต์ ChainMap ใหม่

กลับกัน

คุณอาจสงสัยว่าคุณสามารถเปลี่ยนลำดับของ ChainMap ได้อย่างไร ที่สามารถทำได้โดยใช้ฟังก์ชันย้อนกลับซึ่งส่งคืนตัววนซ้ำสำหรับการวนซ้ำผ่าน ChainMap ในทิศทางย้อนกลับ ลองดูสิ่งนี้ในการดำเนินการ

คีย์ 'b' อยู่ในแผนที่ทั้งหมดแล้ว แผนที่แรกใน ChainMap มีคีย์ 'b' ที่มีค่าเท่ากับ 9

ห่วงโซ่1[ 'b' ]
#>> 9

ลองดูว่าจะเกิดอะไรขึ้นเมื่อเราวนซ้ำในทิศทางที่กลับกัน

chain1.maps = ย้อนกลับ (chain1.maps)
ห่วงโซ่1[ 'b' ]
#>> 2

โปรดจำไว้ว่า ฟังก์ชันการกลับด้านไม่ได้ย้อนกลับการแมปจริงๆ แต่ให้ตัววนซ้ำแบบย้อนกลับ

อ่าน: Python Tutorial

เดเก

Deque (ออกเสียงว่า 'deck' ) เป็นส่วนขยายของรายการ แต่เป็นรายการแบบปลายคู่ Deque ย่อมาจาก: Double Ended Queue เนื่องจากเราสามารถลบ/เปิดและผนวกองค์ประกอบที่ปลายด้านใดด้านหนึ่งของ Deques ได้อย่างมีประสิทธิภาพ ซึ่งแตกต่างจากรายการที่การดำเนินการทั้งหมดอยู่ทางด้านขวา

deque(iterable, maxlen) รับค่า iterables และส่งคืนวัตถุ deque พวกเขายังมีพารามิเตอร์ maxlen ซึ่งกำหนดขีดจำกัดสูงสุดของจำนวนองค์ประกอบ หากไม่ระบุ เดเกสามารถเติบโตได้ไม่มีกำหนด มาดูวิธีการที่รวดเร็วของมันกัน

deq = collections.deque([ 1 , 2 , 3 , 4 , 5 ], แม็กซ์เลน= 6 )
deq.appendleft( 8 )

#ผลลัพธ์:
เด็ค([ 8 , 1 , 2 , 3 , 4 , 5 ])

ดังที่เราเห็น การเรียก เมธอด appendleft ผนวกองค์ประกอบทางด้านซ้ายสุด ยิ่งไปกว่านั้น เนื่องจากเราได้เริ่มต้นมันด้วย maxlen เป็น 6 ซึ่งมันได้มาถึงตอนนี้ การผนวกองค์ประกอบอื่นจะส่ง “StopIterationError”

ดังนั้นเรามาลบองค์ประกอบด้านซ้ายส่วนใหญ่โดยใช้ popleft :

deq.popleft()
#>> 8

นอกจากนี้เรายังสามารถลบองค์ประกอบเฉพาะตามค่าโดยใช้การ ลบ:

deq.remove( 5 )
#>> เด็ค([1, 2, 3, 4])

หมายเหตุ: การเรียกวิธีการลบด้วยองค์ประกอบที่ไม่ได้อยู่ใน deque จะส่ง "ValueError"

เราสามารถแทรกองค์ประกอบใด ๆ ที่ดัชนีที่ระบุโดยใช้ insert(index, element )

deq.insert( 2 , 7 )
#>> เด็ค([1, 2, 7, 3, 4])

Deque สามารถย้อนกลับได้โดยการเรียก วิธีการ ย้อนกลับ

deq.ย้อนกลับ()
#>> เดค([4, 3, 7, 2, 1])


Deque ยังสามารถหมุนตามเข็มนาฬิกาหรือทวนเข็มนาฬิกาโดยใช้ วิธีการ หมุน

#ตามเข็มนาฬิกาdeq.rotate( 2 )#>> เด็ค([2, 1, 4, 3, 7])

#ทวนเข็มนาฬิกาdeq.rotate ( -2 )#>> เดค([4, 3, 7, 2, 1])

ชื่อทูเปิล

namedtuple() เป็นการยกระดับที่ยอดเยี่ยมของอ็อบเจกต์ tuple ปกติใน Python Named Tuples ช่วยให้เราสามารถจัดทำดัชนีองค์ประกอบตามชื่อ มากกว่าแค่ตำแหน่ง คุณสามารถนึกถึงชื่อทูเพิลที่มีชื่อเป็นตารางที่มีชื่อตารางเป็นชื่อทูเพิลและชื่อคอลัมน์เป็นชื่อดัชนี Named Tuple กำหนดความหมายให้กับแต่ละองค์ประกอบเป็นหลักเพื่อให้เข้าถึงได้ง่ายขึ้นและโค้ดที่อ่านง่ายขึ้น

มาดูตัวอย่างและทำความเข้าใจวิธีการทำงานกัน

ประสิทธิภาพ = collections.namedtuple ( 'Employee_Rating' , [ 'Q1' , 'Q2' , 'Q3' , 'Q4' ])

ในโค้ดข้างต้น เราได้กำหนดอ็อบเจ็กต์ Named Tuple "ประสิทธิภาพ" ของชื่อ "Employee_Rating" โดยมีชื่อฟิลด์เป็น "Q1", "Q2", "Q3" และ "Q4" ซึ่งจะจัดเก็บการให้คะแนนรายไตรมาสของพนักงาน มาสร้างรายการ tuple 2 รายการของ Employee_Rating

ราหุล = ประสิทธิภาพ( 3 , 4 , 3.5 , 4.5 )
ankit = ประสิทธิภาพ ( 4 , 4.5 , 4 , 4.5 )

#ผลลัพธ์:
Employee_Rating(Q1= 4 , Q2= 4.5 , Q3= 4 , Q4= 4.5 )
Employee_Rating(Q1= 3 , Q2= 4 , Q3= 3.5 , Q4= 4.5 )


ตอนนี้เราได้สร้าง 2 รายการแล้ว เราสามารถเข้าถึงได้โดยใช้ชื่อดัชนี

ankit.Q1
#>> 4

ankit.Q3 > ราหุล.Q3
#>> ทรู


ในการเพิ่มรายการใหม่หรือสร้างชื่อ tuple วัตถุใหม่ เราสามารถใช้ เมธอด _make()

Milkha = Performance._make([ 4 , 5 , 5 , 4.5 ])
มิลค์ฮา

#ผลลัพธ์:
Employee_Rating(Q1= 4 , Q2= 5 , Q3= 5 , Q4= 4.5 )

เราสามารถแก้ไของค์ประกอบโดยใช้ เมธอด _replace บนทูเพิลที่มีชื่อ

rahul._replace(Q1= 2 )

#ผลลัพธ์:
Employee_Rating(Q1= 2 , Q2= 4 , Q3= 3.5 , Q4= 4.5 )

ก่อนที่คุณจะไป

โมดูลคอลเล็กชันมีฟังก์ชันที่เป็นประโยชน์อีกสองสามอย่าง เช่น OrderedDict, defaultdict, UserList, UserString, UserDict ตรวจสอบให้แน่ใจว่าคุณได้รับฟังค์ชั่นต่างๆ ที่เราได้พูดคุยกันในบทช่วยสอนนี้ คอนเทนเนอร์ประเภทนี้ไม่เพียงแต่ทำให้ชีวิตของคุณง่ายขึ้น แต่ยังช่วยปรับปรุงคุณภาพของโค้ดที่คุณเขียนอีกด้วย

หากคุณอยากเรียนรู้เกี่ยวกับ python, data science, ลองดู IIIT-B & upGrad's Executive PG Program in Data Science ซึ่งสร้างขึ้นสำหรับมืออาชีพที่ทำงานและมีกรณีศึกษาและโครงการมากกว่า 10 แบบ, เวิร์กช็อปภาคปฏิบัติ, การให้คำปรึกษากับผู้เชี่ยวชาญในอุตสาหกรรม แบบตัวต่อตัวกับที่ปรึกษาในอุตสาหกรรม การเรียนรู้มากกว่า 400 ชั่วโมงและความช่วยเหลือด้านงานกับบริษัทชั้นนำ

โมดูลการรวบรวมคืออะไร และมีประโยชน์อย่างไร?

โมดูลคอลเลกชันของ Python รองรับคอนเทนเนอร์หลายประเภท คอนเทนเนอร์คืออ็อบเจ็กต์ที่ใช้เก็บไอเท็มต่างๆ และให้วิธีการดึงและวนซ้ำบนออบเจกต์ที่ปิดล้อม Tuple, List, Dictionary และคอนเทนเนอร์ในตัวอื่น ๆ พร้อมใช้งาน นอกจากนี้ โมดูล Collections ยังมีประเภทข้อมูลคอนเทนเนอร์ที่เชี่ยวชาญและมีประสิทธิภาพสูง เช่น namedtuple(), deque, OrderedDict, counter และอื่นๆ ซึ่งเหนือกว่าคอนเทนเนอร์ Python มาตรฐานมาก

โมดูลการรวบรวมเป็นหัวข้อที่จำเป็นสำหรับ Python หรือไม่

ใช่ โมดูลการรวบรวมเป็นหัวข้อที่จำเป็นในขณะที่เรียนรู้ Python การนับอ็อบเจ็กต์ การสร้างคิวและสแต็ค การจัดการคีย์ที่หายไปในพจนานุกรม และอื่นๆ ล้วนเป็นไปได้ด้วยโมดูลคอลเลกชันของ Python ประเภทข้อมูลและคลาสของคอลเล็กชันถูกสร้างขึ้นให้มีประสิทธิภาพและเป็น Pythonic สิ่งเหล่านี้มีค่ามากสำหรับอาชีพการเขียนโปรแกรม Python ของคุณ ดังนั้นการสละเวลาเพื่อเรียนรู้เกี่ยวกับโมดูลคอลเลกชันนี้จึงคุ้มค่ากับเวลาและความพยายามของคุณ คอนเทนเนอร์ในโมดูลคอลเลคชันอาจค่อนข้างเป็นประโยชน์สำหรับโครงการและโมเดลระดับธุรกิจ โดยเพิ่มประโยชน์ให้กับคอนเทนเนอร์ Python ทั่วไปอย่างมากผ่านการเพิ่มประสิทธิภาพและความเร็วในการดำเนินการที่ได้รับการปรับปรุง

ชนิดข้อมูลใดบ้างที่มีอยู่ในโมดูลการรวบรวม

มีข้อมูลหลายประเภทในโมดูลการรวบรวม เช่น deque, defaultdict, namedtuple, OrderedDict, Counter, ChainMap, UserDict, UserList, UserString เป็นต้น ชนิดข้อมูลเหล่านี้สามารถใช้ด้วยเหตุผลต่างๆ เช่น การเพิ่มและลบรายการจาก สิ้นสุดลำดับ สร้างค่าเริ่มต้นสำหรับคีย์ที่หายไป และเพิ่มลงในพจนานุกรมโดยอัตโนมัติ ชนิดข้อมูลเหล่านี้สามารถช่วยได้ด้วยการจัดหาฟิลด์ที่มีชื่อซึ่งอนุญาตให้เข้าถึงรายการตามชื่อในขณะที่รักษาความสามารถในการเข้าถึงรายการตามดัชนี การนับรายการที่ไม่ซ้ำในลำดับหรือทำซ้ำได้ และถือว่าการแมปหลายรายการเป็นอ็อบเจ็กต์พจนานุกรมเดียว ฯลฯ