การสร้างพจนานุกรมใหม่ใน Python


454

ฉันต้องการสร้างพจนานุกรมใน Python อย่างไรก็ตามตัวอย่างทั้งหมดที่ฉันเห็นกำลังสร้างอินสแตนซ์พจนานุกรมจากรายการ ฯลฯ ..

ฉันจะสร้างพจนานุกรมว่างเปล่าใหม่ใน Python ได้อย่างไร

คำตอบ:


661

โทรdictโดยไม่มีพารามิเตอร์

new_dict = dict()

หรือเพียงแค่เขียน

new_dict = {}

39
มีความแตกต่างระหว่าง dict () และ {} หรือไม่? หรือว่าคนชอบมากกว่าหนึ่งอื่น ๆ ?
Matt

52
@ Matt Apparently CPython 2.7 dict () ช้าลง (ช้าลง 6 เท่า?) ดู: doughellmann.com/2012/11/11 ......ในกรณีใด ๆ ฉันเริ่มชอบไวยากรณ์ตัวสร้างต่อไปตั้งแต่ฉันพบว่าพิมพ์และย้ายรหัสได้ง่ายขึ้น ระหว่าง dicts และการเรียกใช้ฟังก์ชัน
David Wheaton

16
ฉันยืนยันว่ามันเร็วกว่าการใช้ {} มากกว่า dict () 3 ครั้งใน python 3.x
Alex Azazel

8
ใช่ฉันได้รับประมาณ 4 ครั้งได้เร็วขึ้นในหลาม 3.6 สำหรับ{}มากกว่าdict()5 ครั้งกว่า[] list()
Michael Hall

10
ในกรณีส่วนใหญ่นั้นไม่สำคัญว่าจะใช้เวลานานกว่าหกเท่าเพราะยังคงมีเวลาน้อยมาก
hypehuman


27

การรู้วิธีการเขียนพจนานุกรมที่ตั้งไว้ล่วงหน้ามีประโยชน์ที่จะรู้เช่นกัน:

cmap =  {'US':'USA','GB':'Great Britain'}

# Explicitly:
# -----------
def cxlate(country):
    try:
        ret = cmap[country]
    except KeyError:
        ret = '?'
    return ret

present = 'US' # this one is in the dict
missing = 'RU' # this one is not

print cxlate(present) # == USA
print cxlate(missing) # == ?

# or, much more simply as suggested below:

print cmap.get(present,'?') # == USA
print cmap.get(missing,'?') # == ?

# with country codes, you might prefer to return the original on failure:

print cmap.get(present,present) # == USA
print cmap.get(missing,missing) # == RU

4
จุดดี! แต่ฉันคิดว่าส่วนเล็กน้อยที่cxlateทำให้คำตอบของคุณดูซับซ้อนเกินไป ฉันแค่ให้ส่วนการเริ่มต้น ( cxlateตัวเองซับซ้อนเกินไปคุณทำได้return cmap.get(country, '?'))
Daniel Darabos

พิจารณาใช้docs.python.org/2/library/…แทนที่จะเขียนฟังก์ชันแปลหรือใช้. get () ทุกที่
Sparr

1
บางทีฉันอาจจะยกเว้นว่าเอกสารนั้นทึบแสงสำหรับฉัน - มันแย่มาก ฉันไม่รู้ว่าพวกเขากำลังบอกให้ฉันทำหรือทำไมฉันควรทำ และ. get () ดูเหมือนว่าจะทำในสิ่งที่ถูกต้อง - และมันยืดหยุ่นอย่างมาก ฉันแน่ใจว่ามันขาดความเข้าใจในส่วนของฉัน คำถามก็คือ: ทำไมต้องรำคาญด้วย? สิ่งที่บันทึกไว้ที่นี่ง่ายขึ้นที่นี่เร็วขึ้นที่นี่ ฯลฯ ประโยชน์คืออะไรกันแน่
fyngyrz

1
ไม่เกี่ยวข้อง แต่คุณควรจับKeyErrorแทนอย่างชัดเจนยกเว้น (ซึ่งจะจับสิ่งต่าง ๆ เช่นKeyboardInterruptและSystemExit)
Arnav Borborah

Arnav ใช่แน่นอนคุณพูดถูก แก้ไขตามนั้น ขอบคุณ!
fyngyrz


15
d = dict()

หรือ

d = {}

หรือ

import types
d = types.DictType.__new__(types.DictType, (), {})

ความแตกต่างระหว่างtypes.DictType.__new__(types.DictType, (), {})และเพียงแค่คืออะไร{}

2
สำหรับทุกคนที่อ่านสิ่งนี้: "ทางออก" สุดท้ายเป็นเรื่องตลก - คุณสามารถใช้มัน (ใน python 2.x อย่างน้อย - จะไม่ทำงานใน py3k) แต่ไม่มีใครในใจของตัวเองอยากจะทำ ดังนั้น ;-)
bruno desthuilliers


4
>>> dict.fromkeys(['a','b','c'],[1,2,3])


{'a': [1, 2, 3], 'b': [1, 2, 3], 'c': [1, 2, 3]}

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