ใน Python จะใช้พจนานุกรมรายการหรือตั้งเมื่อใด


294

ฉันควรใช้พจนานุกรมรายการหรือตั้งค่าเมื่อใด

มีสถานการณ์ที่เหมาะสมกับแต่ละประเภทข้อมูลมากขึ้นหรือไม่

คำตอบ:


603

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


6
โปรดทราบว่า Python 3.7 มีการสั่งซื้อตามค่าเริ่มต้น
Gigi Bayte 2

172
  • คุณต้องการลำดับของรายการที่สั่งใช่ไหม? ไปสำหรับรายการ
  • คุณเพียงแค่ต้องรู้ว่าคุณมีค่าเฉพาะหรือไม่ แต่ไม่มีการสั่งซื้อ (และคุณไม่จำเป็นต้องเก็บรายการซ้ำ)? ใช้ชุด
  • คุณต้องการเชื่อมโยงค่ากับคีย์เพื่อให้สามารถค้นหาได้อย่างมีประสิทธิภาพ (โดยใช้คีย์) ในภายหลังหรือไม่ ใช้พจนานุกรม.

30
นี่ควรเป็นส่วน "TL; DR" สำหรับคำตอบข้างต้นโดย Alex M. :-)
Alex Boschmans

9
ฉันคิดว่ามันเป็นอีกทางหนึ่ง .. อเล็กซ์ควรบริจาคคะแนนเสียงให้จอน คำตอบนี้ครอบคลุมทุกอย่างมากและกระชับและชัดเจนยิ่งขึ้น
mehmet

อย่างไรก็ตามหากคุณต้องการทราบความแตกต่างของความซับซ้อนของเวลาระหว่างข้อมูลเหล่านี้คำอธิบายของ Alex ทำงานได้ดีขึ้น
kcEmenike

19

setเมื่อคุณต้องการเก็บเรียงลำดับขององค์ประกอบที่ไม่ซ้ำกันใช้ (ตัวอย่างเช่นเมื่อคุณต้องการชุดคำทั้งหมดที่ใช้ในเอกสาร)

tupleเมื่อคุณต้องการที่จะเก็บรายการสั่งซื้อที่ไม่เปลี่ยนรูปของธาตุให้ใช้ (ตัวอย่างเช่นเมื่อคุณต้องการคู่ (ชื่อ, phone_number) ที่คุณต้องการใช้เป็นองค์ประกอบในชุดคุณจะต้องมีสิ่งอันดับมากกว่ารายการเนื่องจากชุดต้องมีองค์ประกอบที่ไม่เปลี่ยนรูป)

listเมื่อคุณต้องการในการเก็บรวบรวมรายการสั่งซื้อที่ไม่แน่นอนขององค์ประกอบการใช้งาน (ตัวอย่างเช่นเมื่อคุณต้องการต่อท้ายหมายเลขโทรศัพท์ใหม่ในรายการ: [หมายเลข 1, หมายเลข 2, ... ])

dictเมื่อคุณต้องการทำแผนที่จากคีย์กับค่าให้ใช้ (ตัวอย่างเช่นเมื่อคุณต้องการสมุดโทรศัพท์ซึ่งแผนที่ชื่อไปยังหมายเลขโทรศัพท์: {'John Smith' : '555-1212'}) หมายเหตุคีย์ต่างๆใน dict นั้นไม่มีการเรียงลำดับ (หากคุณวนซ้ำตามคำสั่ง (สมุดโทรศัพท์) คีย์ (ชื่อ) อาจปรากฏขึ้นตามลำดับใด ๆ )


เอ่อเขาไม่ได้ถามเรื่องทูเปิล
habnabit

18
  • ใช้พจนานุกรมเมื่อคุณมีชุดของคีย์เฉพาะที่แมปกับค่า

  • ใช้รายการถ้าคุณมีรายการสั่งซื้อชุด

  • ใช้ชุดเพื่อจัดเก็บชุดรายการที่ไม่เรียงลำดับ


6

ในระยะสั้นใช้:

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]เท่ากับ x
  • l.reverse()- ฝืนรายการlในสถานที่

รายการที่สามารถใช้เป็นสแต็คโดยการใช้ประโยชน์ของวิธีการและappendpop

พจนานุกรม

พจนานุกรมแมปค่าแฮชกับวัตถุโดยพลการ พจนานุกรมเป็นวัตถุที่ไม่แน่นอน การดำเนินการหลักในพจนานุกรมกำลังเก็บค่าด้วยบางคีย์และแยกค่าที่กำหนดให้กับคีย์

ในพจนานุกรมคุณไม่สามารถใช้เป็นค่าคีย์ที่ไม่สามารถแฮชได้นั่นคือค่าที่มีรายการพจนานุกรมหรือประเภทที่ไม่แน่นอนอื่น ๆ

ชุด

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


5

แม้ว่าสิ่งนี้จะไม่ครอบคลุมsets แต่เป็นคำอธิบายที่ดีของdicts และlists:

รายการคือสิ่งที่พวกเขาดูเหมือน - รายการของค่า แต่ละอันจะถูกกำหนดหมายเลขเริ่มต้นจากศูนย์ - อันแรกคือเลขศูนย์ 1 ที่สอง 2 ที่ 3 ฯลฯ คุณสามารถลบค่าออกจากรายการและเพิ่มค่าใหม่ไปยังจุดสิ้นสุด ตัวอย่าง: ชื่อแมวจำนวนมากของคุณ

พจนานุกรมมีความคล้ายคลึงกับชื่อที่พวกเขาแนะนำ - พจนานุกรม ในพจนานุกรมคุณมี 'ดัชนี' ของคำและสำหรับแต่ละคำนิยาม ในไพ ธ อนคำว่า 'คีย์' และคำนิยาม 'ค่า' ค่าในพจนานุกรมนั้นไม่ได้มีการกำหนดหมายเลขเหมือนกันกับชื่อที่พวกเขาแนะนำ - พจนานุกรม ในพจนานุกรมคุณมี 'ดัชนี' ของคำและสำหรับแต่ละคำนิยาม ค่าในพจนานุกรมไม่ได้ถูกจัดลำดับไว้ แต่ไม่อยู่ในลำดับที่เฉพาะเจาะจงเช่นกัน - คีย์ทำสิ่งเดียวกัน คุณสามารถเพิ่มลบและแก้ไขค่าในพจนานุกรม ตัวอย่าง: สมุดโทรศัพท์

http://www.sthurlow.com/python/lesson06/


4

สำหรับ 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 อยู่ที่นี่


3

ร่วมกับรายการ , dictsและชุดนอกจากนี้ยังมีวัตถุอื่นหลามที่น่าสนใจOrderedDicts

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

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


1

รายการคือสิ่งที่พวกเขาดูเหมือน - รายการของค่า แต่ละอันจะถูกกำหนดหมายเลขเริ่มต้นจากศูนย์ - อันแรกคือเลขศูนย์ 1 ที่สอง 2 ที่ 3 ฯลฯ คุณสามารถลบค่าออกจากรายการและเพิ่มค่าใหม่ไปยังจุดสิ้นสุด ตัวอย่าง: ชื่อแมวจำนวนมากของคุณ

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

พจนานุกรมมีความคล้ายคลึงกับชื่อที่พวกเขาแนะนำ - พจนานุกรม ในพจนานุกรมคุณมี 'ดัชนี' ของคำและสำหรับแต่ละคำนิยาม ในไพ ธ อนคำว่า 'คีย์' และคำนิยาม 'ค่า' ค่าในพจนานุกรมนั้นไม่ได้มีการกำหนดหมายเลขเหมือนกันกับชื่อที่พวกเขาแนะนำ - พจนานุกรม ในพจนานุกรมคุณมี 'ดัชนี' ของคำและสำหรับแต่ละคำนิยาม ในไพ ธ อนคำว่า 'คีย์' และคำนิยาม 'ค่า' ค่าในพจนานุกรมไม่ได้ถูกจัดลำดับไว้ แต่ไม่อยู่ในลำดับที่เฉพาะเจาะจงเช่นกัน - คีย์ทำสิ่งเดียวกัน คุณสามารถเพิ่มลบและแก้ไขค่าในพจนานุกรม ตัวอย่าง: สมุดโทรศัพท์


1

เมื่อใช้พวกเขาฉันจะทำ 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'}}

1

พจนานุกรม: ใช้พจนานุกรมไพ ธ อนเช่นตารางแฮชที่มีคีย์เป็นดัชนีและวัตถุเป็นค่า

รายการ: รายการใช้สำหรับเก็บวัตถุในอาเรย์ที่จัดทำดัชนีโดยตำแหน่งของวัตถุนั้นในอาเรย์

ชุด: ชุดคือชุดที่มีฟังก์ชั่นที่สามารถบอกได้ว่ามีวัตถุหรือไม่อยู่ในชุด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.