ฉันมีพจนานุกรมด้านล่าง:
colors = {
"blue" : "5",
"red" : "6",
"yellow" : "8",
}
ฉันจะจัดทำดัชนีรายการแรกในพจนานุกรมได้อย่างไร
colors[0]
จะส่งกลับKeyError
ด้วยเหตุผลที่ชัดเจน
ฉันมีพจนานุกรมด้านล่าง:
colors = {
"blue" : "5",
"red" : "6",
"yellow" : "8",
}
ฉันจะจัดทำดัชนีรายการแรกในพจนานุกรมได้อย่างไร
colors[0]
จะส่งกลับKeyError
ด้วยเหตุผลที่ชัดเจน
คำตอบ:
พจนานุกรมไม่เรียงลำดับในเวอร์ชัน 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
d.iterkeys().next()
แทนd.keys()[0]
การตรวจสอบคีย์ใดคีย์หนึ่งโดยไม่ต้องถอดออก หากพจนานุกรมมีขนาดใหญ่ก็จะสร้างความแตกต่างอย่างมากในแง่ของประสิทธิภาพ เช่นเดียวกับค่าและรายการ ใน Python 2.7 คุณยังสามารถใช้dict view object ได้
หากใครยังคงดูคำถามนี้อยู่ตอนนี้คำตอบที่ได้รับการยอมรับนั้นล้าสมัยแล้ว:
เนื่องจาก 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 เป็นต้นไป)
การพูดถึงองค์ประกอบของพจนานุกรมก็เหมือนกับการนั่งบนลาและเพลิดเพลินไปกับการนั่ง
ตามกฎของ 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ไม่มีระเบียบ !
ที่จริงฉันพบวิธีแก้ปัญหาใหม่ที่ช่วยฉันได้จริงๆหากคุณกังวลเป็นพิเศษกับดัชนีของค่าหนึ่งในรายการหรือชุดข้อมูลคุณสามารถตั้งค่าพจนานุกรมเป็นดัชนีนั้นได้!:
แค่ดู:
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}
ขณะนี้ด้วยพลังของแฮชแมปคุณสามารถดึงดัชนีรายการของคุณในเวลาคงที่ (หรือที่เรียกว่าเร็วขึ้นมาก)
โอ้เป็นเรื่องยาก สิ่งที่คุณมีโดยพื้นฐานแล้วคือค่าสองค่าสำหรับแต่ละรายการ จากนั้นคุณพยายามโทรหาพวกเขาโดยใช้หมายเลขเป็นกุญแจ ขออภัยค่าหนึ่งของคุณถูกกำหนดให้เป็นกุญแจสำคัญแล้ว!
ลองสิ่งนี้:
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]) จะคืนค่าเป็น "สีน้ำเงิน"
หรือจะใช้ลิสต์ก็ได้
โชคดี!
คุณทำไม่ได้เนื่องจากdict
ไม่มีการเรียงลำดับ คุณสามารถใช้.popitem()
เพื่อรับไอเท็มโดยพลการ แต่จะลบออกจากการเขียน