φυβλαςのβλογ
บล็อกของ phyblas



maya python เบื้องต้น บทที่ ๒๘: การใช้ดิกชันนารี
เขียนเมื่อ 2016/03/11 16:38
แก้ไขล่าสุด 2021/09/28 16:42
ในบทที่ ๗ ได้กล่าวถึงการใช้ลิสต์และทูเพิลไปแล้ว แต่นอกจากสองอย่างนั้นแล้วก็ยังมีข้อมูลอีกรูปแบบหนึ่งที่สามารถเก็บรายการ ของตัวแปรหลายๆอันได้ นั่นคือสิ่งที่เรียกว่าดิกชันนารี

ดิกชันนารี จะต่างจากลิสต์กับทูเพิลซึ่งจัดเรียงตัวแปรโดยนำมาวางเรียงไปเรื่อยๆทีละตัว แต่จะต้องประกอบไปด้วยสองส่วนคือ "คีย์" กับ "ค่า" ซึ่งเป็นคู่อันดับกัน

การสร้างดิกชันนารีทำได้โดยพิมพ์วงเล็บปีกกา {} แล้วภายในใส่คีย์กับค่าทีละคู่โดยระหว่างคีย์กับค่ากั้นด้วยจุดคู่ : และระหว่างแต่ละคู่กั้นด้วยลูกน้ำ ,

ตัวอย่าง สร้างดิกชันนารีเก็บรัศมีในหน่วยกิโลเมตรของดาวเคราะห์ ๖ ดวงขึ้นมา
ratsami = {'daophut':2440,
'daosuk':6052,
'lok':6378,
'daoangkhan':3397,
'daopharuehat':71492,
'daosao':60268}

ถ้า
print(ratsami)

จะได้ผลออกมาเป็น
{'daosao': 60268, 'daosuk': 6052, 'daoangkhan': 3397, 'lok': 6378, 'daopharuehat': 71492, 'daophut': 2440}

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

การเข้าถึงค่าทำได้โดยการพิมพ์คีย์ลงไปใน [] หลังชื่อดิกชันนารี
print(ratsami['daosao'])

ก็จะได้ ค่า 60268 ออกมา

ถ้าลองพิมพ์
mc.polySphere(r=ratsami['lok']/1000.,n='lok')

ก็จะได้ทรงกลมขนาดรัศมี 6.378 หน่วย (ขอย่อลงพันเท่าไม่เช่นนั้นจะใหญ่เกินไป)





เราอาจเพิ่มสมาชิกลงในดิกชันนารีที่มีอยู่แล้วได้โดยการพิมพ์ชื่อคีย์ใหม่ที่ยังไม่มีเข้าไป เช่น
ratsami['daouranus'] = 25559

แต่ถ้าคีย์ที่ใส่มีอยู่แล้วก็จะกลายเป็นการแก้ค่าแทน

หากพิมพ์ต่อท้ายชื่อดิกชันนารีด้วย .keys() ก็จะคืนลิสต์ของคีย์ทั้งหมดกลับมา เช่น
ratsami.keys() # ได้ ['daouranus','daosao', 'daosuk', 'daoangkhan', 'lok', 'daopharuehat', 'daophut']

หากพิมพต่อท้ายด้วย .values() จะได้ลิสต์ของค่าทั้งหมดออกมา
ratsami.values() # ได้ [25559, 60268, 6052, 3397, 6378, 71492, 2440]

หากใช้ for กับดิกชันนารี จะเป็นการไล่ทำซ้ำตามลำดับคีย์ โดยตัวแปรที่ตามหลัง for นั้นจะรับค่าของคีย์ เช่น
for dao in ratsami:
    mc.polySphere(r=ratsami[dao]/1000.,n=dao)

แบบนี้จะได้ทรงกลมที่มีชื่อตามคีย์และมีรัศมีตามค่า (อย่างไรก็ตาม ทั้งหมดซ้อนทับกันอยู่)





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

อีกตัวอย่างการใช้ เช่น บางครั้งคนเราก็ไม่สะดวกที่จะบอกอะไรเป็นตัวเลข อาจบอกแค่ว่า เล็ก กลาง ใหญ่ เป็นต้น

ถ้าใครเคยเล่นเกม pharaoh ของค่าย sierra มาก่อนละก็ ในเกมนั้นมีให้สร้างพีรามิดแบบต่างๆ ซึ่งพีรามิดที่สร้างก็มีขนาดกำหนดตายตัว

ลองใช้ดิกชันนารีกำหนดขนาดของพีรามิดขั้นบันไดที่จะสร้างขึ้น โดยมี ๔ ขนาด เล็ก กลาง ใหญ่ มหึมาแต่ละขนาดก็มีจำนวนขั้นบันไดไม่เท่ากัน
khan = {'lek':4,'klang':7,'yai':10,'mahuema':15}
k = khan['yai']
mc.polyCube(w=k*20,h=10,d=k*20,n='pyramidkhanbandai')
mc.move(0,5,0)
mc.select('.f[1]')
for i in range(k-1):
    mc.polyExtrudeFacet(off=10)
    mc.polyExtrudeFacet(ty=10)

แบบนี้ก็จะได้พีรามิดขนาดใหญ่ คือมี ๑๐ ขั้น ถ้าแก้ k เป็น khan['mahuema'] ก็จะได้ ๑๕ ชั้น



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

เช่น ลองสร้างดิกชันนารีเก็บพิกัดสีต่างๆที่ต้องการ ซึ่งพิกัดสีต้องประกอบไปด้วยค่าแม่สีสามสี แดง เขียว น้ำเงิน
si = {'thao_on':[0.36,0.36,0.36],
    'thao_khem':[0.11,0.11,0.11],
    'khiao_on':[0.18,0.92,0.52],
    'khiao_khem':[0.01,0.05,0.03],
    'daeng_on':[0.81,0.29,0.3],
    'daeng_khem':[0.33,0.05,0.07],
    'som':[0.62,0.24,0.09],
    'namtan':[0.14,0.04,0.02],
    'namngoen':[0.04,0.09,0.22],
    'fa':[0.26,0.58,0.87]}

เวลาอ้างอิงถึงค่าข้างในก็เช่น
si['saeng_on'][2]

ก็จะได้ 0.3 เป็นต้น

หรืออาจสร้างในรูปดิกชันนารีของดิกชันนารีก็ได้
si = {'thao_on':{'d':0.36,'k':0.36,'n':0.36},
    'thao_khem':{'d':0.11,'k':0.11,'n':0.11},
    'khiao_on':{'d':0.18,'k':0.92,'n':0.52},
    'khiao_khem':{'d':0.01,'k':0.05,'n':0.03},
    'daeng_on':{'d':0.81,'k':0.29,'n':0.3},
    'daeng_khem':{'d':0.33,'k':0.05,'n':0.07},
    'som':{'d':0.62,'k':0.24,'n':0.09},
    'namtan':{'d':0.14,'k':0.04,'n':0.02},
    'namngoen':{'d':0.04,'k':0.09,'n':0.22},
    'fa':{'d':0.26,'k':0.58,'n':0.87}}

เวลาอ้างอิงถึงค่าข้างในก็เช่น
si['daeng_khem']['k']

ก็จะได้ค่าสีเขียนภายในสีแดงเข้ม คือ 0.05 เป็นต้น

ลองเอามาใช้สร้างวัสดุสีต่างๆขึ้นมา
for s in si:
    mc.shadingNode('blinn',asShader=1,n='si_'+s)
    mc.setAttr(('si_'+s+'.c'),si[s]['d'],si[s]['k'],si[s]['n'],typ='double3')

เปิดไฮเพอร์เชดเพื่อดูผลที่ได้





เนื้อหาเพิ่มเติมเกี่ยวกับดิกชันนารีในภาษาไพธอนอ่านได้ใน https://phyblas.hinaboshi.com/tsuchinoko14

<< บทที่แล้ว      บทถัดไป >>
หน้าสารบัญ


-----------------------------------------

囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

ดูสถิติของหน้านี้

หมวดหมู่

-- คอมพิวเตอร์ >> เขียนโปรแกรม >> python >> mayapython
-- คอมพิวเตอร์ >> 3D >> maya

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

สารบัญ

รวมคำแปลวลีเด็ดจากญี่ปุ่น
มอดูลต่างๆ
-- numpy
-- matplotlib

-- pandas
-- manim
-- opencv
-- pyqt
-- pytorch
การเรียนรู้ของเครื่อง
-- โครงข่าย
     ประสาทเทียม
ภาษา javascript
ภาษา mongol
ภาษาศาสตร์
maya
ความน่าจะเป็น
บันทึกในญี่ปุ่น
บันทึกในจีน
-- บันทึกในปักกิ่ง
-- บันทึกในฮ่องกง
-- บันทึกในมาเก๊า
บันทึกในไต้หวัน
บันทึกในยุโรปเหนือ
บันทึกในประเทศอื่นๆ
qiita
บทความอื่นๆ

บทความแบ่งตามหมวด



ติดตามอัปเดตของบล็อกได้ที่แฟนเพจ

  ค้นหาบทความ

  บทความแนะนำ

ตัวอักษรกรีกและเปรียบเทียบการใช้งานในภาษากรีกโบราณและกรีกสมัยใหม่
ที่มาของอักษรไทยและความเกี่ยวพันกับอักษรอื่นๆในตระกูลอักษรพราหมี
การสร้างแบบจำลองสามมิติเป็นไฟล์ .obj วิธีการอย่างง่ายที่ไม่ว่าใครก็ลองทำได้ทันที
รวมรายชื่อนักร้องเพลงกวางตุ้ง
ภาษาจีนแบ่งเป็นสำเนียงอะไรบ้าง มีความแตกต่างกันมากแค่ไหน
ทำความเข้าใจระบอบประชาธิปไตยจากประวัติศาสตร์ความเป็นมา
เรียนรู้วิธีการใช้ regular expression (regex)
การใช้ unix shell เบื้องต้น ใน linux และ mac
g ในภาษาญี่ปุ่นออกเสียง "ก" หรือ "ง" กันแน่
ทำความรู้จักกับปัญญาประดิษฐ์และการเรียนรู้ของเครื่อง
ค้นพบระบบดาวเคราะห์ ๘ ดวง เบื้องหลังความสำเร็จคือปัญญาประดิษฐ์ (AI)
หอดูดาวโบราณปักกิ่ง ตอนที่ ๑: แท่นสังเกตการณ์และสวนดอกไม้
พิพิธภัณฑ์สถาปัตยกรรมโบราณปักกิ่ง
เที่ยวเมืองตานตง ล่องเรือในน่านน้ำเกาหลีเหนือ
ตระเวนเที่ยวตามรอยฉากของอนิเมะในญี่ปุ่น
เที่ยวชมหอดูดาวที่ฐานสังเกตการณ์ซิงหลง
ทำไมจึงไม่ควรเขียนวรรณยุกต์เวลาทับศัพท์ภาษาต่างประเทศ

ไทย

日本語

中文