ฉันควรใช้พจนานุกรมรายการหรือตั้งค่าเมื่อใด
มีสถานการณ์ที่เหมาะสมกับแต่ละประเภทข้อมูลมากขึ้นหรือไม่
ฉันควรใช้พจนานุกรมรายการหรือตั้งค่าเมื่อใด
มีสถานการณ์ที่เหมาะสมกับแต่ละประเภทข้อมูลมากขึ้นหรือไม่
คำตอบ:
listช่วยให้การสั่งซื้อdictและsetไม่ได้: เมื่อคุณดูแลเกี่ยวกับการสั่งซื้อดังนั้นคุณต้องใช้list(ถ้าคุณเลือกภาชนะบรรจุที่ถูก จำกัด ไว้ที่สามเหล่านี้แน่นอน ;-)
dictเชื่อมโยงกับแต่ละคีย์ค่าในขณะที่listและsetเพียงแค่มีค่า: กรณีการใช้งานที่แตกต่างกันอย่างเห็นได้ชัด
setต้องการรายการที่จะ hashable, listไม่ได้: ถ้าคุณมีรายการที่ไม่ hashable ดังนั้นคุณจะไม่สามารถใช้และต้องใช้แทนsetlist
setห้ามซ้ำซ้อนlistไม่: ยังมีความแตกต่างที่สำคัญ (A "multiset" ซึ่งแมปรายการที่ซ้ำกันในจำนวนที่แตกต่างกันสำหรับรายการที่มีมากกว่าหนึ่งครั้งสามารถพบได้ในcollections.Counter- คุณสามารถสร้างหนึ่งเป็น a dict, ถ้าด้วยเหตุผลแปลก ๆ บางประการที่คุณไม่สามารถนำเข้าcollectionsหรือใน pre-2.7 Python เป็น a collections.defaultdict(int)ใช้รายการเป็นคีย์และค่าที่เกี่ยวข้องเป็นการนับ)
การตรวจสอบการเป็นสมาชิกของค่าในset(หรือdictสำหรับคีย์) นั้นรวดเร็วอย่างเห็นได้ชัด (ใช้เวลาประมาณสั้น ๆ คงที่) ในขณะที่อยู่ในรายการจะต้องใช้เวลาเป็นสัดส่วนกับความยาวของรายการในกรณีเฉลี่ยและที่เลวร้ายที่สุด ดังนั้นถ้าคุณมีรายการ hashable ไม่สนใจวิธีการเกี่ยวกับการสั่งซื้อหรือรายการที่ซ้ำกันอย่างใดอย่างหนึ่งและต้องการตรวจสอบการเป็นสมาชิกอย่างรวดเร็วและดีกว่าsetlist
setเมื่อคุณต้องการเก็บเรียงลำดับขององค์ประกอบที่ไม่ซ้ำกันใช้ (ตัวอย่างเช่นเมื่อคุณต้องการชุดคำทั้งหมดที่ใช้ในเอกสาร)
tupleเมื่อคุณต้องการที่จะเก็บรายการสั่งซื้อที่ไม่เปลี่ยนรูปของธาตุให้ใช้ (ตัวอย่างเช่นเมื่อคุณต้องการคู่ (ชื่อ, phone_number) ที่คุณต้องการใช้เป็นองค์ประกอบในชุดคุณจะต้องมีสิ่งอันดับมากกว่ารายการเนื่องจากชุดต้องมีองค์ประกอบที่ไม่เปลี่ยนรูป)
listเมื่อคุณต้องการในการเก็บรวบรวมรายการสั่งซื้อที่ไม่แน่นอนขององค์ประกอบการใช้งาน (ตัวอย่างเช่นเมื่อคุณต้องการต่อท้ายหมายเลขโทรศัพท์ใหม่ในรายการ: [หมายเลข 1, หมายเลข 2, ... ])
dictเมื่อคุณต้องการทำแผนที่จากคีย์กับค่าให้ใช้ (ตัวอย่างเช่นเมื่อคุณต้องการสมุดโทรศัพท์ซึ่งแผนที่ชื่อไปยังหมายเลขโทรศัพท์: {'John Smith' : '555-1212'}) หมายเหตุคีย์ต่างๆใน dict นั้นไม่มีการเรียงลำดับ (หากคุณวนซ้ำตามคำสั่ง (สมุดโทรศัพท์) คีย์ (ชื่อ) อาจปรากฏขึ้นตามลำดับใด ๆ )
ใช้พจนานุกรมเมื่อคุณมีชุดของคีย์เฉพาะที่แมปกับค่า
ใช้รายการถ้าคุณมีรายการสั่งซื้อชุด
ใช้ชุดเพื่อจัดเก็บชุดรายการที่ไม่เรียงลำดับ
ในระยะสั้นใช้:
list - หากคุณต้องการลำดับของรายการที่สั่ง
dict - หากคุณต้องการเชื่อมโยงค่ากับคีย์
set - หากคุณต้องการเก็บองค์ประกอบที่เป็นเอกลักษณ์
รายการเป็นลำดับที่ไม่แน่นอนซึ่งโดยปกติจะใช้เพื่อจัดเก็บคอลเลกชันของรายการที่เป็นเนื้อเดียวกัน
รายการใช้การดำเนินการตามลำดับทั้งหมด:
x in l และ x not in ll[i], l[i:j],l[i:j:k]len(l), min(l),max(l)l.count(x)l.index(x[, i[, j]])- ดัชนีของการเกิดขึ้นครั้งที่ 1 ของxในl(ที่หรือหลังiและก่อนที่jดัชนี)รายการยังใช้การดำเนินการลำดับที่ไม่แน่นอนทั้งหมด:
l[i] = x- รายการiของlถูกแทนที่ด้วยxl[i:j] = t- ชิ้นlจากiที่จะjถูกแทนที่ด้วยเนื้อหาของ iterabletdel l[i:j] - เหมือนกับ l[i:j] = []l[i:j:k] = t- องค์ประกอบของl[i:j:k]จะถูกแทนที่ด้วยของtdel l[i:j:k]- ลบองค์ประกอบของs[i:j:k]จากรายการl.append(x)- ต่อท้ายxส่วนท้ายของลำดับl.clear()- ลบรายการทั้งหมดออกจากl(เหมือนกับ del l[:])l.copy()- สร้างสำเนาตื้นของl(เหมือนl[:])l.extend(t)หรือl += t- ขยายlเนื้อหาของtl *= n- อัปเดตlด้วยเนื้อหาซ้ำหลายnครั้งl.insert(i, x)- แทรกxลงlในดัชนีที่กำหนดโดยil.pop([i])- ดึงรายการที่iและลบออกจากll.remove(x)- ลบรายการแรกจากlที่l[i]เท่ากับ xl.reverse()- ฝืนรายการlในสถานที่รายการที่สามารถใช้เป็นสแต็คโดยการใช้ประโยชน์ของวิธีการและappendpop
พจนานุกรมแมปค่าแฮชกับวัตถุโดยพลการ พจนานุกรมเป็นวัตถุที่ไม่แน่นอน การดำเนินการหลักในพจนานุกรมกำลังเก็บค่าด้วยบางคีย์และแยกค่าที่กำหนดให้กับคีย์
ในพจนานุกรมคุณไม่สามารถใช้เป็นค่าคีย์ที่ไม่สามารถแฮชได้นั่นคือค่าที่มีรายการพจนานุกรมหรือประเภทที่ไม่แน่นอนอื่น ๆ
ชุดคือชุดสะสมของวัตถุที่ไม่สามารถสับได้ โดยทั่วไปชุดจะใช้เพื่อรวมการทดสอบการเป็นสมาชิกการลบรายการที่ซ้ำจากลำดับและการคำนวณทางคณิตศาสตร์เช่นการแยกการรวมกันความแตกต่างและความแตกต่างแบบสมมาตร
แม้ว่าสิ่งนี้จะไม่ครอบคลุมsets แต่เป็นคำอธิบายที่ดีของdicts และlists:
รายการคือสิ่งที่พวกเขาดูเหมือน - รายการของค่า แต่ละอันจะถูกกำหนดหมายเลขเริ่มต้นจากศูนย์ - อันแรกคือเลขศูนย์ 1 ที่สอง 2 ที่ 3 ฯลฯ คุณสามารถลบค่าออกจากรายการและเพิ่มค่าใหม่ไปยังจุดสิ้นสุด ตัวอย่าง: ชื่อแมวจำนวนมากของคุณ
พจนานุกรมมีความคล้ายคลึงกับชื่อที่พวกเขาแนะนำ - พจนานุกรม ในพจนานุกรมคุณมี 'ดัชนี' ของคำและสำหรับแต่ละคำนิยาม ในไพ ธ อนคำว่า 'คีย์' และคำนิยาม 'ค่า' ค่าในพจนานุกรมนั้นไม่ได้มีการกำหนดหมายเลขเหมือนกันกับชื่อที่พวกเขาแนะนำ - พจนานุกรม ในพจนานุกรมคุณมี 'ดัชนี' ของคำและสำหรับแต่ละคำนิยาม ค่าในพจนานุกรมไม่ได้ถูกจัดลำดับไว้ แต่ไม่อยู่ในลำดับที่เฉพาะเจาะจงเช่นกัน - คีย์ทำสิ่งเดียวกัน คุณสามารถเพิ่มลบและแก้ไขค่าในพจนานุกรม ตัวอย่าง: สมุดโทรศัพท์
สำหรับ C ++ ฉันมักจะนึกแผนภูมิการไหลนี้อยู่เสมอ: ในสถานการณ์ใดที่ฉันจะใช้คอนเทนเนอร์ STL เฉพาะ ดังนั้นฉันอยากรู้ว่ามีอะไรที่คล้ายกันสำหรับ Python3 หรือไม่ แต่ฉันไม่มีโชค
สิ่งที่คุณต้องคำนึงถึงสำหรับ Python คือ: ไม่มี Python มาตรฐานเดียวสำหรับ C ++ ดังนั้นอาจมีความแตกต่างอย่างมากสำหรับล่าม Python ที่แตกต่างกัน (เช่น CPython, PyPy) แผนภูมิการไหลต่อไปนี้สำหรับ CPython
นอกจากนี้ผมพบว่าไม่มีวิธีที่ดีที่จะรวมโครงสร้างข้อมูลต่อไปนี้ในแผนภาพ: bytes, byte arrays, tuples, named_tuples, ChainMap, และCounterarrays
OrderedDictและdequeมีให้ผ่านcollectionsโมดูลheapqสามารถใช้ได้จากheapqโมดูลLifoQueue, QueueและPriorityQueueสามารถใช้ได้ผ่านqueueโมดูลที่ออกแบบมาสำหรับการเข้าถึงพร้อมกัน (เธรด) (นอกจากนี้ยังมีmultiprocessing.Queueให้ใช้ แต่ฉันไม่ทราบความแตกต่างqueue.Queueแต่คาดว่าควรใช้เมื่อจำเป็นต้องใช้การเข้าถึงพร้อมกันจากกระบวนการ)dict, set, frozen_setและlistจะ builtin แน่นอนสำหรับทุกคนฉันจะขอบคุณถ้าคุณสามารถปรับปรุงคำตอบนี้และให้ไดอะแกรมที่ดีขึ้นในทุกด้าน รู้สึกเป็นอิสระและยินดีต้อนรับ

PS: แผนภาพถูกสร้างขึ้นด้วย yed ไฟล์ graphml อยู่ที่นี่
ร่วมกับรายการ , dictsและชุดนอกจากนี้ยังมีวัตถุอื่นหลามที่น่าสนใจOrderedDicts
พจนานุกรมที่มีคำสั่งเหมือนกับพจนานุกรมทั่วไป แต่พวกเขาจำคำสั่งที่ใส่ไว้ เมื่อวนซ้ำพจนานุกรมที่เรียงลำดับรายการจะถูกส่งกลับตามลำดับคีย์ของพวกเขาถูกเพิ่มเป็นครั้งแรก
OrderedDictsอาจมีประโยชน์เมื่อคุณต้องการรักษาลำดับของคีย์เช่นการทำงานกับเอกสาร: เป็นเรื่องปกติที่ต้องมีการแทนค่าเวกเตอร์ของคำทั้งหมดในเอกสาร ดังนั้นการใช้OrderedDictsคุณสามารถตรวจสอบได้อย่างมีประสิทธิภาพว่าคำใดถูกอ่านมาก่อนเพิ่มคำศัพท์แยกคำศัพท์และหลังจากกิจวัตรทั้งหมดที่คุณสามารถแยกการแสดงเวกเตอร์ที่ได้รับคำสั่งของพวกเขา
รายการคือสิ่งที่พวกเขาดูเหมือน - รายการของค่า แต่ละอันจะถูกกำหนดหมายเลขเริ่มต้นจากศูนย์ - อันแรกคือเลขศูนย์ 1 ที่สอง 2 ที่ 3 ฯลฯ คุณสามารถลบค่าออกจากรายการและเพิ่มค่าใหม่ไปยังจุดสิ้นสุด ตัวอย่าง: ชื่อแมวจำนวนมากของคุณ
Tuplesเป็นเหมือนรายการ แต่คุณไม่สามารถเปลี่ยนค่าได้ ค่าที่คุณให้ไว้ก่อนเป็นค่าที่คุณติดอยู่กับส่วนที่เหลือของโปรแกรม แต่ละค่าจะถูกกำหนดหมายเลขเริ่มต้นจากศูนย์เพื่อให้อ้างอิงได้ง่าย ตัวอย่าง: ชื่อของเดือนในปี
พจนานุกรมมีความคล้ายคลึงกับชื่อที่พวกเขาแนะนำ - พจนานุกรม ในพจนานุกรมคุณมี 'ดัชนี' ของคำและสำหรับแต่ละคำนิยาม ในไพ ธ อนคำว่า 'คีย์' และคำนิยาม 'ค่า' ค่าในพจนานุกรมนั้นไม่ได้มีการกำหนดหมายเลขเหมือนกันกับชื่อที่พวกเขาแนะนำ - พจนานุกรม ในพจนานุกรมคุณมี 'ดัชนี' ของคำและสำหรับแต่ละคำนิยาม ในไพ ธ อนคำว่า 'คีย์' และคำนิยาม 'ค่า' ค่าในพจนานุกรมไม่ได้ถูกจัดลำดับไว้ แต่ไม่อยู่ในลำดับที่เฉพาะเจาะจงเช่นกัน - คีย์ทำสิ่งเดียวกัน คุณสามารถเพิ่มลบและแก้ไขค่าในพจนานุกรม ตัวอย่าง: สมุดโทรศัพท์
เมื่อใช้พวกเขาฉันจะทำ cheatsheet ครบถ้วนของวิธีการของพวกเขาสำหรับการอ้างอิงของคุณ:
class ContainerMethods:
def __init__(self):
self.list_methods_11 = {
'Add':{'append','extend','insert'},
'Subtract':{'pop','remove'},
'Sort':{'reverse', 'sort'},
'Search':{'count', 'index'},
'Entire':{'clear','copy'},
}
self.tuple_methods_2 = {'Search':'count','index'}
self.dict_methods_11 = {
'Views':{'keys', 'values', 'items'},
'Add':{'update'},
'Subtract':{'pop', 'popitem',},
'Extract':{'get','setdefault',},
'Entire':{ 'clear', 'copy','fromkeys'},
}
self.set_methods_17 ={
'Add':{['add', 'update'],['difference_update','symmetric_difference_update','intersection_update']},
'Subtract':{'pop', 'remove','discard'},
'Relation':{'isdisjoint', 'issubset', 'issuperset'},
'operation':{'union' 'intersection','difference', 'symmetric_difference'}
'Entire':{'clear', 'copy'}}
พจนานุกรม: ใช้พจนานุกรมไพ ธ อนเช่นตารางแฮชที่มีคีย์เป็นดัชนีและวัตถุเป็นค่า
รายการ: รายการใช้สำหรับเก็บวัตถุในอาเรย์ที่จัดทำดัชนีโดยตำแหน่งของวัตถุนั้นในอาเรย์
ชุด: ชุดคือชุดที่มีฟังก์ชั่นที่สามารถบอกได้ว่ามีวัตถุหรือไม่อยู่ในชุด