ฉันควรใช้พจนานุกรมรายการหรือตั้งค่าเมื่อใด
มีสถานการณ์ที่เหมาะสมกับแต่ละประเภทข้อมูลมากขึ้นหรือไม่
ฉันควรใช้พจนานุกรมรายการหรือตั้งค่าเมื่อใด
มีสถานการณ์ที่เหมาะสมกับแต่ละประเภทข้อมูลมากขึ้นหรือไม่
คำตอบ:
list
ช่วยให้การสั่งซื้อdict
และset
ไม่ได้: เมื่อคุณดูแลเกี่ยวกับการสั่งซื้อดังนั้นคุณต้องใช้list
(ถ้าคุณเลือกภาชนะบรรจุที่ถูก จำกัด ไว้ที่สามเหล่านี้แน่นอน ;-)
dict
เชื่อมโยงกับแต่ละคีย์ค่าในขณะที่list
และset
เพียงแค่มีค่า: กรณีการใช้งานที่แตกต่างกันอย่างเห็นได้ชัด
set
ต้องการรายการที่จะ hashable, list
ไม่ได้: ถ้าคุณมีรายการที่ไม่ hashable ดังนั้นคุณจะไม่สามารถใช้และต้องใช้แทนset
list
set
ห้ามซ้ำซ้อนlist
ไม่: ยังมีความแตกต่างที่สำคัญ (A "multiset" ซึ่งแมปรายการที่ซ้ำกันในจำนวนที่แตกต่างกันสำหรับรายการที่มีมากกว่าหนึ่งครั้งสามารถพบได้ในcollections.Counter
- คุณสามารถสร้างหนึ่งเป็น a dict
, ถ้าด้วยเหตุผลแปลก ๆ บางประการที่คุณไม่สามารถนำเข้าcollections
หรือใน pre-2.7 Python เป็น a collections.defaultdict(int)
ใช้รายการเป็นคีย์และค่าที่เกี่ยวข้องเป็นการนับ)
การตรวจสอบการเป็นสมาชิกของค่าในset
(หรือdict
สำหรับคีย์) นั้นรวดเร็วอย่างเห็นได้ชัด (ใช้เวลาประมาณสั้น ๆ คงที่) ในขณะที่อยู่ในรายการจะต้องใช้เวลาเป็นสัดส่วนกับความยาวของรายการในกรณีเฉลี่ยและที่เลวร้ายที่สุด ดังนั้นถ้าคุณมีรายการ hashable ไม่สนใจวิธีการเกี่ยวกับการสั่งซื้อหรือรายการที่ซ้ำกันอย่างใดอย่างหนึ่งและต้องการตรวจสอบการเป็นสมาชิกอย่างรวดเร็วและดีกว่าset
list
set
เมื่อคุณต้องการเก็บเรียงลำดับขององค์ประกอบที่ไม่ซ้ำกันใช้ (ตัวอย่างเช่นเมื่อคุณต้องการชุดคำทั้งหมดที่ใช้ในเอกสาร)
tuple
เมื่อคุณต้องการที่จะเก็บรายการสั่งซื้อที่ไม่เปลี่ยนรูปของธาตุให้ใช้ (ตัวอย่างเช่นเมื่อคุณต้องการคู่ (ชื่อ, phone_number) ที่คุณต้องการใช้เป็นองค์ประกอบในชุดคุณจะต้องมีสิ่งอันดับมากกว่ารายการเนื่องจากชุดต้องมีองค์ประกอบที่ไม่เปลี่ยนรูป)
list
เมื่อคุณต้องการในการเก็บรวบรวมรายการสั่งซื้อที่ไม่แน่นอนขององค์ประกอบการใช้งาน (ตัวอย่างเช่นเมื่อคุณต้องการต่อท้ายหมายเลขโทรศัพท์ใหม่ในรายการ: [หมายเลข 1, หมายเลข 2, ... ])
dict
เมื่อคุณต้องการทำแผนที่จากคีย์กับค่าให้ใช้ (ตัวอย่างเช่นเมื่อคุณต้องการสมุดโทรศัพท์ซึ่งแผนที่ชื่อไปยังหมายเลขโทรศัพท์: {'John Smith' : '555-1212'}
) หมายเหตุคีย์ต่างๆใน dict นั้นไม่มีการเรียงลำดับ (หากคุณวนซ้ำตามคำสั่ง (สมุดโทรศัพท์) คีย์ (ชื่อ) อาจปรากฏขึ้นตามลำดับใด ๆ )
ใช้พจนานุกรมเมื่อคุณมีชุดของคีย์เฉพาะที่แมปกับค่า
ใช้รายการถ้าคุณมีรายการสั่งซื้อชุด
ใช้ชุดเพื่อจัดเก็บชุดรายการที่ไม่เรียงลำดับ
ในระยะสั้นใช้:
list
- หากคุณต้องการลำดับของรายการที่สั่ง
dict
- หากคุณต้องการเชื่อมโยงค่ากับคีย์
set
- หากคุณต้องการเก็บองค์ประกอบที่เป็นเอกลักษณ์
รายการเป็นลำดับที่ไม่แน่นอนซึ่งโดยปกติจะใช้เพื่อจัดเก็บคอลเลกชันของรายการที่เป็นเนื้อเดียวกัน
รายการใช้การดำเนินการตามลำดับทั้งหมด:
x in l
และ x not in l
l[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
ถูกแทนที่ด้วยx
l[i:j] = t
- ชิ้นl
จากi
ที่จะj
ถูกแทนที่ด้วยเนื้อหาของ iterablet
del l[i:j]
- เหมือนกับ l[i:j] = []
l[i:j:k] = t
- องค์ประกอบของl[i:j:k]
จะถูกแทนที่ด้วยของt
del 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
เนื้อหาของt
l *= n
- อัปเดตl
ด้วยเนื้อหาซ้ำหลายn
ครั้งl.insert(i, x)
- แทรกx
ลงl
ในดัชนีที่กำหนดโดยi
l.pop([i])
- ดึงรายการที่i
และลบออกจากl
l.remove(x)
- ลบรายการแรกจากl
ที่l[i]
เท่ากับ xl.reverse()
- ฝืนรายการl
ในสถานที่รายการที่สามารถใช้เป็นสแต็คโดยการใช้ประโยชน์ของวิธีการและappend
pop
พจนานุกรมแมปค่าแฮชกับวัตถุโดยพลการ พจนานุกรมเป็นวัตถุที่ไม่แน่นอน การดำเนินการหลักในพจนานุกรมกำลังเก็บค่าด้วยบางคีย์และแยกค่าที่กำหนดให้กับคีย์
ในพจนานุกรมคุณไม่สามารถใช้เป็นค่าคีย์ที่ไม่สามารถแฮชได้นั่นคือค่าที่มีรายการพจนานุกรมหรือประเภทที่ไม่แน่นอนอื่น ๆ
ชุดคือชุดสะสมของวัตถุที่ไม่สามารถสับได้ โดยทั่วไปชุดจะใช้เพื่อรวมการทดสอบการเป็นสมาชิกการลบรายการที่ซ้ำจากลำดับและการคำนวณทางคณิตศาสตร์เช่นการแยกการรวมกันความแตกต่างและความแตกต่างแบบสมมาตร
แม้ว่าสิ่งนี้จะไม่ครอบคลุมset
s แต่เป็นคำอธิบายที่ดีของdict
s และlist
s:
รายการคือสิ่งที่พวกเขาดูเหมือน - รายการของค่า แต่ละอันจะถูกกำหนดหมายเลขเริ่มต้นจากศูนย์ - อันแรกคือเลขศูนย์ 1 ที่สอง 2 ที่ 3 ฯลฯ คุณสามารถลบค่าออกจากรายการและเพิ่มค่าใหม่ไปยังจุดสิ้นสุด ตัวอย่าง: ชื่อแมวจำนวนมากของคุณ
พจนานุกรมมีความคล้ายคลึงกับชื่อที่พวกเขาแนะนำ - พจนานุกรม ในพจนานุกรมคุณมี 'ดัชนี' ของคำและสำหรับแต่ละคำนิยาม ในไพ ธ อนคำว่า 'คีย์' และคำนิยาม 'ค่า' ค่าในพจนานุกรมนั้นไม่ได้มีการกำหนดหมายเลขเหมือนกันกับชื่อที่พวกเขาแนะนำ - พจนานุกรม ในพจนานุกรมคุณมี 'ดัชนี' ของคำและสำหรับแต่ละคำนิยาม ค่าในพจนานุกรมไม่ได้ถูกจัดลำดับไว้ แต่ไม่อยู่ในลำดับที่เฉพาะเจาะจงเช่นกัน - คีย์ทำสิ่งเดียวกัน คุณสามารถเพิ่มลบและแก้ไขค่าในพจนานุกรม ตัวอย่าง: สมุดโทรศัพท์
สำหรับ C ++ ฉันมักจะนึกแผนภูมิการไหลนี้อยู่เสมอ: ในสถานการณ์ใดที่ฉันจะใช้คอนเทนเนอร์ STL เฉพาะ ดังนั้นฉันอยากรู้ว่ามีอะไรที่คล้ายกันสำหรับ Python3 หรือไม่ แต่ฉันไม่มีโชค
สิ่งที่คุณต้องคำนึงถึงสำหรับ Python คือ: ไม่มี Python มาตรฐานเดียวสำหรับ C ++ ดังนั้นอาจมีความแตกต่างอย่างมากสำหรับล่าม Python ที่แตกต่างกัน (เช่น CPython, PyPy) แผนภูมิการไหลต่อไปนี้สำหรับ CPython
นอกจากนี้ผมพบว่าไม่มีวิธีที่ดีที่จะรวมโครงสร้างข้อมูลต่อไปนี้ในแผนภาพ: bytes
, byte arrays
, tuples
, named_tuples
, ChainMap
, และCounter
arrays
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'}}
พจนานุกรม: ใช้พจนานุกรมไพ ธ อนเช่นตารางแฮชที่มีคีย์เป็นดัชนีและวัตถุเป็นค่า
รายการ: รายการใช้สำหรับเก็บวัตถุในอาเรย์ที่จัดทำดัชนีโดยตำแหน่งของวัตถุนั้นในอาเรย์
ชุด: ชุดคือชุดที่มีฟังก์ชั่นที่สามารถบอกได้ว่ามีวัตถุหรือไม่อยู่ในชุด