จะจัดทำดัชนีลงในพจนานุกรมได้อย่างไร?


97

ฉันมีพจนานุกรมด้านล่าง:

colors = {
    "blue" : "5",
    "red" : "6",
    "yellow" : "8",
}

ฉันจะจัดทำดัชนีรายการแรกในพจนานุกรมได้อย่างไร

colors[0]จะส่งกลับKeyErrorด้วยเหตุผลที่ชัดเจน


4
"ครั้งแรก" หมายถึงอะไร? พจนานุกรมไม่มีลำดับ
ล็อตต์

2
ตอนนี้มีการแทรกพจนานุกรมตั้งแต่ Python 3.7 ตรวจสอบสิ่งนี้: stackoverflow.com/questions/39980323/…
Nikita Alkhovik


1
@ S. Lott ฉันพนันได้เลยว่าเขาจะไม่ถามว่าเขารู้หรือไม่ว่าพวกเขาไม่เรียงลำดับ :)
user7778287

คำตอบ:


113

พจนานุกรมไม่เรียงลำดับในเวอร์ชัน Python จนถึง Python 3.6 หากคุณไม่สนใจเกี่ยวกับการสั่งซื้อของรายการและต้องการที่จะเข้าถึงคีย์หรือค่าดัชนีอยู่แล้วคุณสามารถใช้d.keys()[i]และหรือd.values()[i] d.items()[i](โปรดทราบว่าวิธีการเหล่านี้สร้างรายการคีย์ค่าหรือรายการทั้งหมดใน Python 2.x ดังนั้นหากคุณต้องการมากกว่านี้อีกครั้งให้เก็บรายการไว้ในตัวแปรเพื่อปรับปรุงประสิทธิภาพ)

หากคุณสนใจลำดับของรายการเริ่มต้นด้วย Python 2.7 คุณสามารถcollections.OrderedDictใช้ได้ หรือใช้รายชื่อคู่

l = [("blue", "5"), ("red", "6"), ("yellow", "8")]

หากคุณไม่ต้องการการเข้าถึงด้วยคีย์ (ทำไมตัวเลขของคุณถึงเป็นสาย?)

ใน Python 3.7 พจนานุกรมปกติจะได้รับคำสั่งดังนั้นคุณจึงไม่จำเป็นต้องใช้OrderedDictอีกต่อไป (แต่คุณยังทำได้ - โดยทั่วไปจะเป็นประเภทเดียวกัน) การใช้งาน CPython ของ Python 3.6 ได้รวมการเปลี่ยนแปลงนั้นไว้แล้ว แต่เนื่องจากไม่ได้เป็นส่วนหนึ่งของข้อกำหนดภาษาคุณจึงไม่สามารถพึ่งพาได้ใน Python 3.6


2
ใน Python 2 ให้ใช้d.iterkeys().next()แทนd.keys()[0]การตรวจสอบคีย์ใดคีย์หนึ่งโดยไม่ต้องถอดออก หากพจนานุกรมมีขนาดใหญ่ก็จะสร้างความแตกต่างอย่างมากในแง่ของประสิทธิภาพ เช่นเดียวกับค่าและรายการ ใน Python 2.7 คุณยังสามารถใช้dict view object ได้
simleo

44
ใน Python 3 การเรียกเหล่านี้จะส่งคืนมุมมองแทนที่จะเป็นรายการจริงดังนั้นคุณควรรวมไว้ในการเรียกไปที่รายการ () มิฉะนั้นคุณจะเห็น: วัตถุ "TypeError: 'dict_values' ไม่รองรับการจัดทำดัชนี" ดูคำถาม SO นี้: stackoverflow.com/questions/17431638/…
stifin

3
การแก้ไขเพียงเล็กน้อย: คุณไม่สามารถสร้างดัชนีรายการ () ได้อย่างน้อยก็ไม่ใช่ใน Python 3
John Strong

1
คำตอบนี้ล้าสมัยสำหรับ python 3.6+ โปรดดูคำตอบโดย @Pasha ด้านล่าง
hans

1
@hans คำตอบนี้ล้าสมัยสำหรับ Python 3.7 แต่ไม่ใช่สำหรับ Python 3.6 เนื่องจากลักษณะการเก็บรักษาคำสั่งของพจนานุกรมเป็นรายละเอียดการใช้งานของการใช้งาน CPython ของ Python เวอร์ชันนั้นไม่ใช่ส่วนที่เป็นทางการของภาษา ฉันจะอัปเดตคำตอบตามนี้
Sven Marnach

115

หากใครยังคงดูคำถามนี้อยู่ตอนนี้คำตอบที่ได้รับการยอมรับนั้นล้าสมัยแล้ว:

เนื่องจาก Python 3.7 * พจนานุกรมได้รับการรักษาคำสั่งซึ่งตอนนี้จึงมีพฤติกรรมเหมือนที่collections.OrderedDictเคย น่าเสียดายที่ยังไม่มีวิธีเฉพาะในการจัดทำดัชนีลงในkeys()/ values()ของพจนานุกรมดังนั้นการรับคีย์ / ค่าแรกในพจนานุกรมสามารถทำได้โดย

first_key = list(colors)[0]
first_val = list(colors.values())[0]

หรืออีกวิธีหนึ่ง (หลีกเลี่ยงการสร้างอินสแตนซ์มุมมองคีย์ลงในรายการ)

def get_first_key(dictionary):
    for key in dictionary:
        return key
    raise IndexError

first_key = get_first_key(colors)
first_val = colors[first_key]

หากคุณต้องการnคีย์ -th ก็ในทำนองเดียวกัน

def get_nth_key(dictionary, n=0):
    if n < 0:
        n += len(dictionary)
    for i, key in enumerate(dictionary.keys()):
        if i == n:
            return key
    raise IndexError("dictionary index out of range") 

(* CPython 3.6 รวมคำสั่งตามคำสั่งแล้ว แต่นี่เป็นเพียงรายละเอียดการนำไปใช้งานเท่านั้นข้อกำหนดภาษารวมถึงคำสั่งที่สั่งตั้งแต่ 3.7 เป็นต้นไป)


โปรดระบุลิงก์ไปยังเอกสารที่เกี่ยวข้องได้หรือไม่
Amir Afianian

3

การพูดถึงองค์ประกอบของพจนานุกรมก็เหมือนกับการนั่งบนลาและเพลิดเพลินไปกับการนั่ง

ตามกฎของ Python DICTIONARY นั้นไม่มีระเบียบ

ถ้ามี

dic = {1: "a", 2: "aa", 3: "aaa"}

ตอนนี้สมมติว่าถ้าผมชอบdic[10] = "b"มันก็จะไม่เพิ่มแบบนี้เสมอไป

dic = {1:"a",2:"aa",3:"aaa",10:"b"}

มันอาจจะชอบ

dic = {1: "a", 2: "aa", 3: "aaa", 10: "b"}

หรือ

dic = {1: "a", 2: "aa", 10: "b", 3: "aaa"}

หรือ

dic = {1: "a", 10: "b", 2: "aa", 3: "aaa"}

หรือชุดค่าผสมใด ๆ

ดังนั้นกฎทั่วไปคือDICTIONARYไม่มีระเบียบ !


นี่เป็นเรื่องที่ไม่น่าเชื่อเลย ... ฉันชอบมัน!
Alex Liu 33214

2

หากคุณต้องการพจนานุกรมคำสั่งให้คุณสามารถใช้odict


odict เห็นว่าไม่สนับสนุนการสร้างดัชนีเป็นคีย์ (), ค่า () หรือรายการ ()
Konstantin

2

ที่จริงฉันพบวิธีแก้ปัญหาใหม่ที่ช่วยฉันได้จริงๆหากคุณกังวลเป็นพิเศษกับดัชนีของค่าหนึ่งในรายการหรือชุดข้อมูลคุณสามารถตั้งค่าพจนานุกรมเป็นดัชนีนั้นได้!:

แค่ดู:

list = ['a', 'b', 'c']
dictionary = {}
counter = 0
for i in list:
   dictionary[i] = counter
   counter += 1

print(dictionary) # dictionary = {'a':0, 'b':1, 'c':2}

ขณะนี้ด้วยพลังของแฮชแมปคุณสามารถดึงดัชนีรายการของคุณในเวลาคงที่ (หรือที่เรียกว่าเร็วขึ้นมาก)


1

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

ลองสิ่งนี้:

colors = {1: ["blue", "5"], 2: ["red", "6"], 3: ["yellow", "8"]}

ตอนนี้คุณสามารถเรียกคีย์ตามหมายเลขราวกับว่ามีการจัดทำดัชนีเหมือนรายการ คุณยังสามารถอ้างอิงสีและหมายเลขตามตำแหน่งภายในรายการ

ตัวอย่างเช่น,

colors[1][0]
// returns 'blue'

colors[3][1]
// returns '8'

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

colors_key = {'blue': 1, 'red': 6, 'yllow': 8}

จากนั้นคุณจะสามารถค้นหาคีย์สีได้หากต้องการ

สี [colors_key ['blue']] [0] จะคืนค่าเป็น "blue"

อะไรแบบนั้น.

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

ค่า = {5: [1, 'blue'], 6: [2, 'red'], 8: [3, 'yellow']}

จากนั้น (สี [colors_key [ค่า [5] [1]]] [0]) จะคืนค่าเป็น "สีน้ำเงิน"

หรือจะใช้ลิสต์ก็ได้

โชคดี!


0

คุณทำไม่ได้เนื่องจากdictไม่มีการเรียงลำดับ คุณสามารถใช้.popitem()เพื่อรับไอเท็มโดยพลการ แต่จะลบออกจากการเขียน


next(iter(d.items()))( .iteritems()ใน Python 2) ให้รายการโดยพลการเช่นกัน (เหมือนกันในการทดสอบของฉันซึ่งสมเหตุสมผลเนื่องจากสามารถใช้ popitem ได้โดยใช้สิ่งนี้) แต่จะไม่ลบรายการ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.