defaultdict
"พจนานุกรมมาตรฐานมีวิธี setdefault () สำหรับดึงค่าและสร้างค่าเริ่มต้นหากไม่มีค่าในทางตรงข้ามdefaultdict
ให้ผู้เรียกระบุค่าเริ่มต้น (ค่าที่จะส่งคืน) ล่วงหน้าเมื่อคอนเทนเนอร์เริ่มต้น"
ตามที่กำหนดโดยDoug HellmannในPython Standard Library ตามตัวอย่าง
วิธีใช้ defaultdict
นำเข้า defaultdict
>>> from collections import defaultdict
เริ่มต้น defaultdict
เริ่มต้นมันผ่าน
callableเป็นอาร์กิวเมนต์แรก (จำเป็น)
>>> d_int = defaultdict(int)
>>> d_list = defaultdict(list)
>>> def foo():
... return 'default value'
...
>>> d_foo = defaultdict(foo)
>>> d_int
defaultdict(<type 'int'>, {})
>>> d_list
defaultdict(<type 'list'>, {})
>>> d_foo
defaultdict(<function foo at 0x7f34a0a69578>, {})
** kwargsเป็นอาร์กิวเมนต์ที่สอง (เป็นทางเลือก)
>>> d_int = defaultdict(int, a=10, b=12, c=13)
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12})
หรือ
>>> kwargs = {'a':10,'b':12,'c':13}
>>> d_int = defaultdict(int, **kwargs)
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12})
มันทำงานอย่างไร
เช่นเดียวกับคลาสลูกของพจนานุกรมมาตรฐานมันสามารถทำหน้าที่เดียวกันทั้งหมดได้
แต่ในกรณีที่ผ่านคีย์ที่ไม่รู้จักมันจะส่งกลับค่าเริ่มต้นแทนข้อผิดพลาด ตัวอย่างเช่น:
>>> d_int['a']
10
>>> d_int['d']
0
>>> d_int
defaultdict(<type 'int'>, {'a': 10, 'c': 13, 'b': 12, 'd': 0})
ในกรณีที่คุณต้องการเปลี่ยนค่าเริ่มต้นเขียนทับ default_factory:
>>> d_int.default_factory = lambda: 1
>>> d_int['e']
1
>>> d_int
defaultdict(<function <lambda> at 0x7f34a0a91578>, {'a': 10, 'c': 13, 'b': 12, 'e': 1, 'd': 0})
หรือ
>>> def foo():
... return 2
>>> d_int.default_factory = foo
>>> d_int['f']
2
>>> d_int
defaultdict(<function foo at 0x7f34a0a0a140>, {'a': 10, 'c': 13, 'b': 12, 'e': 1, 'd': 0, 'f': 2})
ตัวอย่างในคำถาม
ตัวอย่างที่ 1
เนื่องจาก int ถูกส่งผ่านเป็น default_factory คีย์ใด ๆ ที่ไม่รู้จักจะส่งกลับค่า 0 ตามค่าเริ่มต้น
ตอนนี้เมื่อสตริงถูกส่งผ่านในลูปมันจะเพิ่มจำนวนตัวอักษรเหล่านั้นเป็น d
>>> s = 'mississippi'
>>> d = defaultdict(int)
>>> d.default_factory
<type 'int'>
>>> for k in s:
... d[k] += 1
>>> d.items()
[('i', 4), ('p', 2), ('s', 4), ('m', 1)]
>>> d
defaultdict(<type 'int'>, {'i': 4, 'p': 2, 's': 4, 'm': 1})
ตัวอย่างที่ 2
เนื่องจากรายการถูกส่งผ่านเป็น default_factory คีย์ใด ๆ ที่ไม่รู้จัก (ไม่มีอยู่) จะส่งคืน [] (เช่นรายการ) ตามค่าเริ่มต้น
ในขณะที่รายการ tuples ถูกส่งผ่านในลูปมันจะผนวกค่าใน d [color]
>>> s = [('yellow', 1), ('blue', 2), ('yellow', 3), ('blue', 4), ('red', 1)]
>>> d = defaultdict(list)
>>> d.default_factory
<type 'list'>
>>> for k, v in s:
... d[k].append(v)
>>> d.items()
[('blue', [2, 4]), ('red', [1]), ('yellow', [1, 3])]
>>> d
defaultdict(<type 'list'>, {'blue': [2, 4], 'red': [1], 'yellow': [1, 3]})
default_factory = None
หลังจากคุณเสร็จสิ้นการเติมค่าเริ่มต้นแล้ว ดูคำถามนี้