ื-Python, ืืืกืฃ ืืื ืืืืืืงื ืืืืื ืงืืืฆื ืฉื ืืืื ืืื ืืืืคืฉืจ ืืขืืื ืืืชื ืืืืืื ืืืช.
ืืืกืคืื ืชืืืืื ืืืจื ืืื ื:
- ืืืืจืฆืื (
for item in collection) - ืืืืงืช ืฉืืืืืช (
x in collection) - ืงืืืขืช ืืืจื (
len(collection)) - ืืืฉื ืืืืฆืขืืช ืืื ืืงืก ืื ืืคืชื (ืื ืืกืืืจืื ืื ืืกืืฆืืืืืืืื)
ื-Python ืืื "ืืืฉืง ืืืกืฃ" ืจืฉืื, ืื ืงืืืืื ืคืจืืืืงืืืื ืื ืจืฉืืืื. ืื ืืืืืืงื ืืืืฉ
__iter__,__len__,__contains__โ ื ืืชื ืืืืฉืืื ืืืืกืฃ.
- ืื ืฉืืื ื ื ืืืกืฃ
- ืืืกืคืื ืืืื ืื
- ืืืกืคืื ืืืจืืืื ืืืกืคืจืืื ืืกืื ืืจืืืช
- ืกืืืื ืืืืื ืืืกืฃ ื ืืกืคืื
- 1. ืจืฉืืืืช โ
list - 2. ืืืืื ืื โ
dict - 3. ืืืคืืื โ
tuple - 4. SimpleNamespace
- 5. ืงืืืฆืืช โ
set - 6. ืงืืืฆืืช ืืืชื ื ืืชื ืืช ืืฉืื ืื โ
frozenset - 7. namedtuple โ ืืืคืืื ืืขืื ืฉื
- 8. deque โ ืชืืจ ืื-ืฆืืื
- 9. Counter โ ืกืืคืจ ืืืื ืืื
- 10. defaultdict โ ืืืืื ืขื ืขืจืื ืืจืืจืช ืืืื
- 11. dataclass โ ืืืืงืืช ื ืชืื ืื
- 12. UserList โ ืจืฉืืืืช ืืืชืืืืช ืืืฉืืช
- 13. UserDict โ ืืืืื ืื ืืืชืืืื ืืืฉืืช
- ๐ ืืฉืืืืช ืืืืจืื ืืืืฆืืขืื
- 1. ืืืืจืื:
listvstuplevsarray.array - 2. ืืืืจืืช ืืืฉื:
listvstuplevsarray.array - 3. ืืืืจืื:
dictvsSimpleNamespacevsdataclass - 4. ืืืคืืืืืืฆืืืช ืืืืจืื:
dataclassืขื__slots__ - 5. ืืืืจืืช ืืืคืืฉ:
listvsset - 6. ืืืืจืื:
setvsfrozenset - 7. ืืืืจืืช ืืืกืคื:
list.appendvsdeque.appendvsdeque.appendleft
- 1. ืืืืจืื:
- ๐ง ืืืืฆืืช ืืืืฆืืขืื
- ๐ ืืฉืืืืช ืืืกืคืื
- ๐ก ืืชื ืืืฉืชืืฉ ืืื?
ืื ืฉืืื ื ื ืืืกืฃ
ืืกืืืื ืืืืื ืืื ื ืืืกืคืื, ืืืืืื ืฉืืื ื ืืืืืื ืงืืืฆืืช ืฉื ืืืื ืืื:
int,float,boolโ ืขืจืืื ืกืงืืจืืืNoneโ ืืขืืจ ืขืจื- ืคืื ืงืฆืืืช, ืืืืืืื, ืืืืงืืช โ ืืื ืืืืืืงืืื, ืื ืื ืืืืื ื ืชืื ืื (ืืื ืื ืื ืืืืืื
__dict__)
ืืืกืคืื ืืืื ืื
ืืืื ืื ืืื ืืืืื:
| ืกืื | ืชืืืืจ |
|---|---|
list | ืจืฆืฃ ืืกืืืจ, ื ืืชื ืืฉืื ืื. |
tuple | ืจืฆืฃ ืืกืืืจ, ืืืชื ื ืืชื ืืฉืื ืื. |
dict | ืืืคืื ืืคืชื-ืขืจื ืืกืืืจ (ืืื Python 3.7). |
set | ืืืกืฃ ืื ืืกืืืจ ืฉื ืืืื ืืื ืืืืืืืื. |
frozenset | ืืจืกื ืืืชื ื ืืชื ืช ืืฉืื ืื ืฉื set. |
ืืืกืคืื ืืืจืืืื ืืืกืคืจืืื ืืกืื ืืจืืืช
| ืกืื | ืืืืื | ืืขื |
|---|---|---|
SimpleNamespace | types | ืืืืืืงื ืขื ืืืคืืื ืื ืืื ืืืื (ืืืืคื ืืืืืื ืขื ืืืฉื ืืจื .). |
namedtuple | collections | ืืืคื ืืืชื ื ืืชื ืืฉืื ืื ืขื ืฉืืืช ืืขืื ืฉื. |
deque | collections | ืชืืจ ืื-ืฆืืื โ ืืขืื ืืคืขืืืช ืืืกืคื/ืืืืงื ืืฉื ื ืืงืฆืืืช. |
Counter | collections | ืชืช-ืืืืงื ืฉื ืืืืื ืืกืคืืจืช ืืืืืืงืืื ืืืืืืืืื. |
defaultdict | collections | ืืืืื ืขื ืขืจืื ืืจืืจืช ืืืื ืขืืืจ ืืคืชืืืช ืืกืจืื. |
dataclass | dataclasses | ืืืืฆืจ ืืืืืืืืช __init__, __repr__, __eq__ ืืื'. |
UserList | collections | ืืืืงื ืืกืืกืืช ืืืืืืืงืืื ืืืืื ืจืฉืืื ืืืชืืืื ืืืฉืืช. |
UserDict | collections | ืืืืงื ืืกืืกืืช ืืืืืืืงืืื ืืืืื ืืืืื ืืืชืืืื ืืืฉืืช. |
ืกืืืื ืืืืื ืืืกืฃ ื ืืกืคืื
ืืืจืืช ืฉืื ืชืืื ื ืงืจืืื "ืืืกืคืื", ืืกืืืื ืืืืื ืื ืื ืืืืฆืืื ืื ืืืืกื ืื ืงืืืฆืืช ืฉื ื ืชืื ืื.
1. str โ ืืืจืืืช
ืจืฆืฃ ืืกืืืจ, ืืืชื ื ืืชื ืืฉืื ืื ืฉื ืชืืืื.
s = "Python"
print(len(s)) # โ 6
print(s[0]) # โ P
print('y' in s) # โ True
print(list(s)) # โ ['P', 'y', 't', 'h', 'o', 'n']
2. bytes, bytearray
bytesโ ืจืฆืฃ ืืืชื ื ืืชื ืืฉืื ืื ืฉื ืืชืื.bytearrayโ ืืจืกื ื ืืชื ืช ืืฉืื ืื.
b = b"ืฉืืื"
print(b[0]) # โ 215
print(len(b)) # โ 10
ba = bytearray(b"ืฉืืื")
ba[0] = 65
print(ba) # โ bytearray(b'A\xbc\x9c\xbc\x95\xbc\x9d')
3. range
ืจืฆืฃ ืืกืคืจื ืขืฆืื, ืืกืืืจ. ืื ืืืืกื ืืช ืืืืื ืืื ืืืืืจืื.
r = range(3)
print(list(r)) # โ [0, 1, 2]
print(1 in r) # โ True
print(r[2]) # โ 2
4. array.array
ืืืืกื ื ืชืื ืื ืืกืคืจืืื ืืืืืื ืืื ืืฆืืจื ืงืืืคืงืืืช (ืืื ื-C).
from array import array
arr = array('i', [1, 2, 3])
print(arr) # โ array('i', [1, 2, 3])
5. ืื ืจืืืจืื ืืืืืจืืืจืื
ืื ืืืืกื ืื ื ืชืื ืื โ ืืืืฆืจืื ืืืชื ืืคื ืืจืืฉื. ืื ืชืืืืื ื-len() ืื ืืื ืืืงืกืฆืื.
gen = (x * 2 for x in range(3))
print(list(gen)) # โ [0, 2, 4]
# len(gen) โ TypeError
6. ChainMap (ื-collections)
ืืืื ืืกืคืจ ืืืืื ืื ืืชืื ืชืฆืืื ืืืช โ ืืืืคืืฉ ืขืืืจ ืืจื ืืืคืืช ืืคื ืืกืืจ.
from collections import ChainMap
d1 = {'a': 1}
d2 = {'b': 2}
cm = ChainMap(d1, d2)
print(cm['a']) # โ 1
print(cm['b']) # โ 2
7. OrderedDict (ื-collections)
ืืืืื ืืืืืจ ืืช ืกืืจ ืืืื ืกื. ืจืืืื ืื ืขืืืจ Python < 3.7.
from collections import OrderedDict
od = OrderedDict([('a', 1), ('b', 2)])
print(od) # โ OrderedDict([('a', 1), ('b', 2)])
8. enum.Enum, enum.Flag
ืืืกืคืื ืฉื ืงืืืขืื ืืขืื ืฉื.
from enum import Enum
class Color(Enum):
RED = 1
GREEN = 2
print(list(Color)) # โ [<Color.RED: 1>, <Color.GREEN: 2>]
9. typing.NamedTuple, typing.TypedDict
ืืขืืคืืช ืืืืืขืืช ืกืืื namedtuple ื-dict.
from typing import NamedTuple, TypedDict
class Person(NamedTuple):
name: str
age: int
p = Person("ื ืืขื", 25)
class Movie(TypedDict):
title: str
year: int
m: Movie = {"title": "ืืืจืืงืก", "year": 1999}
10. heapq, bisect โ ืืืื, ืื ืืืกืคืื
ืขืืืืื ืขื ืืืกืคืื, ืื ืืื ื ืืืื:
heapqโ ืืืืืจืืชื ืชืืจ ืขืืืคืืืืช ืืจื ืจืฉืืืืช.bisectโ ืฉืืืจ ืขื ืกืืจ ืืจืฉืืืืช ืืืืื ืืช.
1. ืจืฉืืืืช โ list
ืืืกืฃ ืืกืืืจ, ื ืืชื ืืฉืื ืื. ืืืืื ืืื ืืืืืื ืืืืืจ ืขื ืขืฆืื, ืื ืืกืืืื ืืืชืจืื.
ืืฉืืฉ ืืืฉืจ ื ืืจืฉืช ืจืฆืฃ ืืืืฉ: ืืืกืคื, ืืืืงื, ืฉืื ืื ืืืื ืืื.
ืืฆืืจืช: []
adam_list = ["ืืื", "ืชื ืืืื", 30, "ืืื ืืก"]
print(f"ืืฆืืจืช ืจืฉืืื: {adam_list}")
# โ ืืฆืืจืช ืจืฉืืื: ['ืืื', 'ืชื ืืืื', 30, 'ืืื ืืก']
print(f"ืืืื ื ืืืื ืืงืก 0: {adam_list[0]}")
# โ ืืืื ื ืืืื ืืงืก 0: ืืื
adam_list[2] = 31
print(f"ืืืืจ ืฉืื ืื: {adam_list}")
# โ ืืืืจ ืฉืื ืื: ['ืืื', 'ืชื ืืืื', 31, 'ืืื ืืก']
adam_list.append("ื ืฉืื")
print(f"ืืืืจ append: {adam_list}")
# โ ืืืืจ append: ['ืืื', 'ืชื ืืืื', 31, 'ืืื ืืก', 'ื ืฉืื']
adam_list.insert(1, "ืืฉืจืื")
print(f"ืืืืจ insert: {adam_list}")
# โ ืืืืจ insert: ['ืืื', 'ืืฉืจืื', 'ืชื ืืืื', 31, 'ืืื ืืก', 'ื ืฉืื']
adam_list.remove("ืืื ืืก")
print(f"ืืืืจ remove ืืคื ืขืจื: {adam_list}")
# โ ืืืืจ remove ืืคื ืขืจื: ['ืืื', 'ืืฉืจืื', 'ืชื ืืืื', 31, 'ื ืฉืื']
del adam_list[2]
print(f"ืืืืจ ืืืืงื ืืคื ืืื ืืงืก: {adam_list}")
# โ ืืืืจ ืืืืงื ืืคื ืืื ืืงืก: ['ืืื', 'ืืฉืจืื', 31, 'ื ืฉืื']
adam_list.extend(["ืชืืืืืื", "ืืืื"])
print(f"ืืืืจ extend: {adam_list}")
# โ ืืืืจ extend: ['ืืื', 'ืืฉืจืื', 31, 'ื ืฉืื', 'ืชืืืืืื', 'ืืืื']
adam_list.pop()
print(f"ืืืืจ pop: {adam_list}")
# โ ืืืืจ pop: ['ืืื', 'ืืฉืจืื', 31, 'ื ืฉืื', 'ืชืืืืืื']
2. ืืืืื ืื โ dict
ืืืกืฃ ืฉื ืืืืืช ืืคืชื โ ืขืจื. ืืืคืชืืืช ืืืืืื ืืืืืช ื ืืชื ืื ืืืืฉ. ืืื Python 3.7, ืกืืจ ืืืื ืกื ื ืฉืืจ.
ืฉืืืืฉื ืื ืชืื ืื ืืืื ืื: ืคืจืืคืืืื, ืชืฆืืจืืช, JSON.
ืืฆืืจืช: {}
noa_dict = {"name": "ื ืืขื", "age": 25, "city": "ืืืคื", "profession": "ืืื ืืช"}
print(f"ืืฆืืจืช ืืืืื: {noa_dict}")
# โ ืืฆืืจืช ืืืืื: {'name': 'ื ืืขื', 'age': 25, 'city': 'ืืืคื', 'profession': 'ืืื ืืช'}
print(f"ืขืจื ืขืืืจ ืืคืชื 'name': {noa_dict['name']}")
# โ ืขืจื ืขืืืจ ืืคืชื 'name': ื ืืขื
noa_dict["age"] = 26
print(f"ืืืืจ ืขืืืื: {noa_dict}")
# โ ืืืืจ ืขืืืื: {'name': 'ื ืืขื', 'age': 26, 'city': 'ืืืคื', 'profession': 'ืืื ืืช'}
noa_dict["hobby"] = "ืฆืืืจ"
print(f"ืืืืจ ืืืกืคืช ืืื: {noa_dict}")
# โ ืืืืจ ืืืกืคืช ืืื: {'name': 'ื ืืขื', 'age': 26, 'city': 'ืืืคื', 'profession': 'ืืื ืืช', 'hobby': 'ืฆืืืจ'}
del noa_dict["city"]
print(f"ืืืืจ ืืืืงืช ืืื: {noa_dict}")
# โ ืืืืจ ืืืืงืช ืืื: {'name': 'ื ืืขื', 'age': 26, 'profession': 'ืืื ืืช', 'hobby': 'ืฆืืืจ'}
hobby = noa_dict.pop("hobby")
print(f"ืืืืจ pop: {noa_dict}, ืขืจื: {hobby}")
# โ ืืืืจ pop: {'name': 'ื ืืขื', 'age': 26, 'profession': 'ืืื ืืช'}, ืขืจื: ืฆืืืจ
print(f"ืืคืชื 'name' ืงืืื: {'name' in noa_dict}")
# โ ืืคืชื 'name' ืงืืื: True
3. ืืืคืืื โ tuple
ืืืกืฃ ืืกืืืจ, ืืืชื ื ืืชื ืืฉืื ืื. ืืชืืื ืื ืชืื ืื ืงืืืขืื.
ืืฉืืฉ ืืืฉืจ ืืืกืจ ืฉืื ืื ืืื ืงืจืืื: ืงืืืืจืืื ืืืช, ืคืจืืืจืื, ืขืจืื ืืืืจื.
ืืฆืืจืช: ()
adam_tuple = ("ืืื", "ืชื ืืืื", 30, "ืืื ืืก")
print(f"ืืฆืืจืช ืืืคื: {adam_tuple}")
# โ ืืฆืืจืช ืืืคื: ('ืืื', 'ืชื ืืืื', 30, 'ืืื ืืก')
print(f"ืืืื ื ืืืื ืืงืก 2: {adam_tuple[2]}")
# โ ืืืื ื ืืืื ืืงืก 2: 30
# adam_tuple[0] = "ืืืื" โ TypeError
# adam_tuple.append("ืืฉืื") โ AttributeError
- ืืืคืืื ืืฉืชืืฉืื ืืคืืืช ืืืืจืื ืืืืืจืื ืืืชืจ ืืจืฉืืืืช.
- ืืืืืืืืื ืืืฉืจ ืฉืื ืื ืืื ื ื ืืจืฉ.
4. SimpleNamespace
ืืืืงื ืคืฉืืื ื-types ืืืฆืืจืช ืืืืืืงืืื ืขื ืืืคืืื ืื ืืื ืืืื. ืืืฉื ืืืืฆืขืืช ื ืืืฆืืืช ื ืงืืื (obj.attr).
ืฉืืืืฉื ืืืฉืจ ืจืืฆืื ืชืืืืจ obj.name ืืื ืืืืจืช ืืืืงื ืืืื.
from types import SimpleNamespace
noa_ns = SimpleNamespace(name="ื ืืขื", age=25, city="ืืืคื")
print(f"ืืืืืืงื: {noa_ns}")
# โ ืืืืืืงื: namespace(name='ื ืืขื', age=25, city='ืืืคื')
print(f"ืฉื: {noa_ns.name}")
# โ ืฉื: ื ืืขื
noa_ns.age = 26
print(f"ืืืืจ ืขืืืื: {noa_ns}")
# โ ืืืืจ ืขืืืื: namespace(name='ื ืืขื', age=26, city='ืืืคื')
noa_ns.profession = "ืืื ืืช"
print(f"ืขื ืืืคืืื ืืืฉ: {noa_ns}")
# โ ืขื ืืืคืืื ืืืฉ: namespace(name='ื ืืขื', age=26, city='ืืืคื', profession='ืืื ืืช')
del noa_ns.city
print(f"ืืืืจ ืืืืงื: {noa_ns}")
# โ ืืืืจ ืืืืงื: namespace(name='ื ืืขื', age=26, profession='ืืื ืืช')
setattr(noa_ns, "hobby", "ืฆืืืจ")
print(f"ืืจื setattr: {noa_ns}")
# โ ืืจื setattr: namespace(name='ื ืืขื', age=26, profession='ืืื ืืช', hobby='ืฆืืืจ')
delattr(noa_ns, "hobby")
print(f"ืืจื delattr: {noa_ns}")
# โ ืืจื delattr: namespace(name='ื ืืขื', age=26, profession='ืืื ืืช')
- ืืืืคื ืืืืืื ืืืฉืจ
obj.nameืขืืืฃ ืขืobj['name'].
5. ืงืืืฆืืช โ set
ืืืกืฃ ืื ืืกืืืจ ืฉื ืืืื ืืื ืืืืืืืื. ืชืืื ืืคืขืืืืช ืงืืืฆืชืืืช: ืืืืื, ืืืชืื, ืืคืจืฉ.
ืืฉืืฉ ืืืกืจืช ืืคืืืืืืช ืืืืืงืช ืฉืืืืืช.
ืืฆืืจืช: {} ืื set()
numbers = {1, 2, 3, 3, 2, 1}
print(f"ืงืืืฆื: {numbers}")
# โ ืงืืืฆื: {1, 2, 3}
numbers.add(4)
print(f"ืืืืจ ืืืกืคื: {numbers}")
# โ ืืืืจ ืืืกืคื: {1, 2, 3, 4}
numbers.remove(2)
print(f"ืืืืจ ืืกืจื: {numbers}")
# โ ืืืืจ ืืกืจื: {1, 3, 4}
others = {3, 4, 5}
print(f"ืืืืื: {numbers | others}")
# โ ืืืืื: {1, 3, 4, 5}
print(f"ืืืชืื: {numbers & others}")
# โ ืืืชืื: {3, 4}
print(f"ืืคืจืฉ: {numbers - others}")
# โ ืืคืจืฉ: {1}
6. ืงืืืฆืืช ืืืชื ื ืืชื ืืช ืืฉืื ืื โ frozenset
ืืจืกื ืืืชื ื ืืชื ืช ืืฉืื ืื ืฉื set. ื ืืชื ืืืฉืชืืฉ ืื ืืืคืชื ืืืืืื ืื ืืืืืจ ืืงืืืฆื ืืืจืช.
frozen = frozenset([1, 2, 3, 2])
print(f"frozenset: {frozen}")
# โ frozenset: frozenset({1, 2, 3})
others = frozenset([3, 4])
print(f"ืืืชืื: {frozen & others}")
# โ ืืืชืื: frozenset({3})
print(f"ืืืืื: {frozen | others}")
# โ ืืืืื: frozenset({1, 2, 3, 4})
# frozen.add(5) โ AttributeError
7. namedtuple โ ืืืคืืื ืืขืื ืฉื
ืืื ื ืืืชื ื ืืชื ืืฉืื ืื ืขื ืืืฉื ืืคื ืฉื ืฉืื. ืงืจืื ืืืชืจ ืืืืคืืื ืจืืืืื.
from collections import namedtuple
Person = namedtuple("Person", ["name", "age", "city"])
noa = Person("ื ืืขื", 25, "ืืืคื")
print(f"ืืืืืืงื: {noa}")
# โ ืืืืืืงื: Person(name='ื ืืขื', age=25, city='ืืืคื')
print(f"ืฉื: {noa.name}")
# โ ืฉื: ื ืืขื
print(f"ืืื: {noa[1]}")
# โ ืืื: 25
# noa.age = 26 โ AttributeError
noa_new = noa._replace(age=26)
print(f"ืขืืชืง ืขื ืฉืื ืื: {noa_new}")
# โ ืขืืชืง ืขื ืฉืื ืื: Person(name='ื ืืขื', age=26, city='ืืืคื')
- ืืืืืืื ืืจืฉืืืืช: ื ืงืืืืช, ืืฉืชืืฉืื, ืชืฆืืจืืช โ ืืืฉืจ ืืืกืจ ืฉืื ืื ืืงืจืืืืช ืืฉืืืื.
8. deque โ ืชืืจ ืื-ืฆืืื
ืืืืคืื ืืคืขืืืช ืืืกืคื/ืืืืงื ืืืืจื ืืฉื ื ืืงืฆืืืช. ืืขืื ืืืชืจ ื-list ืขืืืจ appendleft, popleft.
from collections import deque
d = deque([1, 2, 3])
print(f"deque ืจืืฉืื ื: {d}")
# โ deque ืจืืฉืื ื: deque([1, 2, 3])
d.appendleft(0)
print(f"ืืืืจ appendleft: {d}")
# โ ืืืืจ appendleft: deque([0, 1, 2, 3])
d.append(4)
print(f"ืืืืจ append: {d}")
# โ ืืืืจ append: deque([0, 1, 2, 3, 4])
left = d.popleft()
print(f"ืืืืจ popleft: {left}, ื ืืชืจ: {d}")
# โ ืืืืจ popleft: 0, ื ืืชืจ: deque([1, 2, 3, 4])
right = d.pop()
print(f"ืืืืจ pop: {right}, ื ืืชืจ: {d}")
# โ ืืืืจ pop: 4, ื ืืชืจ: deque([1, 2, 3])
- ืืฉืืืืฉ ืืืืืืจืืชืืื: BFS, ืืืืืขื LRU, ืืืฆืฆืื โ ืืืฉืจ ืคืขืืืืช ืืงืฆืืืช ืฆืจืืืืช ืืืืืช ืืืืจืืช.
9. Counter โ ืกืืคืจ ืืืื ืืื
ืกืืคืจ ืืช ืืชืืืจืืช ืฉื ืืืื ืืื ืืืืืืืงื ืืืืจืืืื. ืฉืืืืฉื ืืกืืืืกืืืงื ืื ืืชืื.
from collections import Counter
text = "abracadabra"
c = Counter(text)
print(f"ืกืคืืจืช ืืืชืืืช: {c}")
# โ ืกืคืืจืช ืืืชืืืช: Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
print(f"ืชืืืจืืช ืฉื 'a': {c['a']}")
# โ ืชืืืจืืช ืฉื 'a': 5
print(f"TOP 3: {c.most_common(3)}")
# โ TOP 3: [('a', 5), ('b', 2), ('r', 2)]
c2 = Counter("bukva")
c.update(c2)
print(f"ืืืืจ update: {c}")
# โ ืืืืจ update: Counter({'a': 6, 'b': 3, 'r': 2, 'c': 1, 'd': 1, 'u': 1, 'k': 1, 'v': 1})
- ืฉืืืืฉื ืื ืืชืื ืืงืกื, ืืืืื, ืืฆืืขืืช โ ืืื ืืงืื ืฉืื ืฆืจืื ืืกืคืืจ "ืื ืืืคืืข ืืื ืืจืื".
10. defaultdict โ ืืืืื ืขื ืขืจืื ืืจืืจืช ืืืื
ืืืฆืจ ืืืืืืืืช ืขืจืื ืืจืืจืช ืืืื ืขืืืจ ืืคืชืืืช ืืกืจืื. ืืกืืจ ืืช ืืฆืืจื ืืืืืงืืช if key in dict.
from collections import defaultdict
dd_list = defaultdict(list)
dd_list["fruits"].append("ืชืคืื")
dd_list["fruits"].append("ืื ื ื")
print(f"ืจืฉืืื: {dict(dd_list)}")
# โ ืจืฉืืื: {'fruits': ['ืชืคืื', 'ืื ื ื']}
dd_int = defaultdict(int)
for char in "abracadabra":
dd_int[char] += 1
print(f"ืกืคืืจืืช: {dict(dd_int)}")
# โ ืกืคืืจืืช: {'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1}
dd_set = defaultdict(set)
dd_set["cities"].add("ืชื ืืืื")
dd_set["cities"].add("ืืืคื")
print(f"ืงืืืฆื: {dict(dd_set)}")
# โ ืงืืืฆื: {'cities': {'ืชื ืืืื', 'ืืืคื'}}
- ืืกืืจ ืงืื ืฉืืืืจ ืขื ืขืฆืื ืืื
if key not in d: d[key] = []. - ืืืคื ืืช ืืงืื ืืคืฉืื ืืืืื ืืืชืจ.
11. dataclass โ ืืืืงืืช ื ืชืื ืื
ืืงืืจืืืจ ืืืืฆืจ ืืืืืืืืช __init__, __repr__, __eq__ ืืื'.
from dataclasses import dataclass
@dataclass
class Person:
name: str
age: int
city: str = "ืื ืฆืืื"
noa = Person("ื ืืขื", 25)
print(f"ืืืืืืงื: {noa}")
# โ ืืืืืืงื: Person(name='ื ืืขื', age=25, city='ืื ืฆืืื')
print(f"ืฉื: {noa.name}")
# โ ืฉื: ื ืืขื
noa.age = 26
print(f"ืืืืจ ืขืืืื: {noa}")
# โ ืืืืจ ืขืืืื: Person(name='ื ืืขื', age=26, city='ืื ืฆืืื')
yoav = Person("ืืืื", 30)
print(f"ื ืืขื == ืืืื: {noa == yoav}")
# โ ื ืืขื == ืืืื: False
@dataclass(frozen=True)
class ImmutablePerson:
name: str
age: int
itay = ImmutablePerson("ืืืชื", 40)
# itay.age = 41 โ FrozenInstanceError
- ืืืืืฃ ืืชืืื ืืื ืืช ืฉื
__init__,__repr__,__eq__. - ืืืืืืื ื-DTO, ืชืฆืืจืืช, ืืืืืื.
12. UserList โ ืจืฉืืืืช ืืืชืืืืช ืืืฉืืช
ืืืจืฉ ื-collections.UserList. ืืฉืืฉ ืืืฆืืจืช ืจืฉืืืืช ืขื ืืชื ืืืืช ืืืชืืืช ืืืฉืืช.
from collections import UserList
class LoggingList(UserList):
def append(self, item):
print(f"[LOG] ืืืกืคื: {item}")
super().append(item)
def remove(self, item):
print(f"[LOG] ืืกืจื: {item}")
super().remove(item)
log_list = LoggingList([1, 2, 3])
print(f"ืืชืืืชื: {log_list}")
# โ ืืชืืืชื: [1, 2, 3]
log_list.append(4)
# โ [LOG] ืืืกืคื: 4
print(f"ืืืืจ append: {log_list}")
# โ ืืืืจ append: [1, 2, 3, 4]
log_list.remove(2)
# โ [LOG] ืืกืจื: 2
print(f"ืืืืจ remove: {log_list}")
# โ ืืืืจ remove: [1, 3, 4]
- ืฉืืืืฉื ืืืืกืคืช ืืืืื, ืืืืืช, ืื ืฉืื ืื ืืืชื ืืืืช ืืกืื ืืจืืืช ืฉื ืจืฉืืืืช.
13. UserDict โ ืืืืื ืื ืืืชืืืื ืืืฉืืช
ืืืจืฉ ื-collections.UserDict. ืืฉืืฉ ืืืฆืืจืช ืืืืื ืื ืขื ืืชื ืืืืช ืืืชืืืช ืืืฉืืช.
from collections import UserDict
class LowercaseDict(UserDict):
def __setitem__(self, key, value):
key = key.lower() if isinstance(key, str) else key
super().__setitem__(key, value)
def __getitem__(self, key):
key = key.lower() if isinstance(key, str) else key
return super().__getitem__(key)
ld = LowercaseDict()
ld["Name"] = "ื ืืขื"
print(f"ืขืจื ืขืืืจ 'Name': {ld['Name']}")
# โ ืขืจื ืขืืืจ 'Name': ื ืืขื
print(f"ืขืจื ืขืืืจ 'name': {ld['name']}")
# โ ืขืจื ืขืืืจ 'name': ื ืืขื
print(f"ืืคืชืืืช: {list(ld.keys())}")
# โ ืืคืชืืืช: ['name']
- ืืฉืืืืฉ ืื ืจืืื ืืคืชืืืช, ืืืืืช, ืืืืื, ืืืืื ืืื'.
๐ ืืฉืืืืช ืืืืจืื ืืืืฆืืขืื
ืืืืจืช ืืืืกืฃ ืืฉืคืืขื ืขื ืืืฆืืขืื ืืฆืจืืืช ืืืืจืื. ืืืื ืืืื ืืืฆืืขืื ืืขืฉืืื.
1. ืืืืจืื: list vs tuple vs array.array
import sys
from array import array
n = 1_000_000
data = list(range(n))
data_t = tuple(range(n))
data_a = array('i', range(n))
print(f"list: {sys.getsizeof(data) / 1024 / 1024:.2f} MB")
# โ list: 8.00 MB
print(f"tuple: {sys.getsizeof(data_t) / 1024 / 1024:.2f} MB")
# โ tuple: 8.00 MB
print(f"array: {sys.getsizeof(data_a) / 1024 / 1024:.2f} MB")
# โ array: 3.81 MB
array.arrayืืฉืชืืฉ ื~2x ืคืืืช ืืืืจืื ืืืกืคืจืื.listื-tupleืืฉืชืืฉืื ืืืืืจืื ืืืื, ืืtupleืืืืจ ืืืชืจ ืืขื ืืืืืจืฆืื.
2. ืืืืจืืช ืืืฉื: list vs tuple vs array.array
import time
def time_access(collection, name):
start = time.perf_counter()
total = 0
for i in range(len(collection)):
total += collection[i]
end = time.perf_counter()
print(f"{name}: {end - start:.4f} ืฉื ืืืช")
n = 10_000_000
lst = list(range(n))
tpl = tuple(range(n))
arr = array('i', range(n))
time_access(lst, "list") # โ list: 1.2000 ืฉื ืืืช
time_access(tpl, "tuple") # โ tuple: 1.0000 ืฉื ืืืช
time_access(arr, "array") # โ array: 0.8000 ืฉื ืืืช
array.arrayืืื ืืืืจ ืื ืชืื ืื ืืกืคืจืืื.tupleืืืืจ ื-10โ20% ื-list.- ืืืืื ืืืื ืืงื ื ืืืื ืืืื.
3. ืืืืจืื: dict vs SimpleNamespace vs dataclass
d = {"name": "A", "age": 25, "city": "X", "hobby": "Y", "job": "Z"}
ns = SimpleNamespace(name="A", age=25, city="X", hobby="Y", job="Z")
dc = Person("A", 25, "X")
print(f"dict: {sys.getsizeof(d)} ืืชืื") # โ 232
print(f"SimpleNamespace: {sys.getsizeof(ns)} ืืชืื") # โ 64
print(f"dataclass: {sys.getsizeof(dc)} ืืชืื") # โ 64
print(f"ns.__dict__: {sys.getsizeof(ns.__dict__)} ืืชืื") # โ 232
SimpleNamespaceื-dataclassืืฉืชืืฉืื ืืืืชื ืืืืช ืืืืจืื ืืืdictืืืื__dict__.- ืืฉืชืืฉ ื-
__slots__ืืืืกืืื ืืืืืจืื.
4. ืืืคืืืืืืฆืืืช ืืืืจืื: dataclass ืขื __slots__
@dataclass
class PersonSlots:
__slots__ = ("name", "age", "city", "hobby", "job")
name: str
age: int
city: str
hobby: str
job: str
dc_slots = PersonSlots("A", 25, "X", "Y", "Z")
print(f"dataclass + slots: {sys.getsizeof(dc_slots)} ืืชืื")
# โ 80 ืืชืื
# dc_slots.new = "value" โ AttributeError
__slots__ืืืกื ืืืืจืื ืืืืืฅ ืืืฉื ืืืืคืืื ืื.- ืืืกืจืื: ืื ื ืืชื ืืืืกืืฃ ืืืคืืื ืื ืืื ืืืื.
5. ืืืืจืืช ืืืคืืฉ: list vs set
n = 1_000_000
lst = list(range(n))
st = set(range(n))
def time_in(collection, target, name):
start = time.perf_counter()
for _ in range(1000):
_ = target in collection
end = time.perf_counter()
print(f"{name} (ืืืคืืฉ {target}): {end - start:.4f} ืฉื ืืืช")
time_in(lst, 999_999, "list") # โ 10.0000 ืฉื ืืืช
time_in(st, 999_999, "set") # โ 0.0005 ืฉื ืืืช
setืืืืจ ืคื ืืืคืืื ื-listืืืืืงืช ืฉืืืืืช.- ืชืืื ืืฉืชืืฉ ื-
setืืืืืงืืช ืชืืืคืืช ืฉืx in collection.
6. ืืืืจืื: set vs frozenset
s = set(range(1000))
fs = frozenset(range(1000))
print(f"set: {sys.getsizeof(s)} ืืชืื") # โ 32792
print(f"frozenset: {sys.getsizeof(fs)} ืืชืื") # โ 32792
frozensetื-setืืฉืชืืฉืื ืืืืชื ืืืืช ืืืืจืื.- ืืืืื ืืื ืจืง ืืฉืื ืื.
7. ืืืืจืืช ืืืกืคื: list.append vs deque.append vs deque.appendleft
from collections import deque
import time
def time_append(collection, n, method='append'):
start = time.perf_counter()
for i in range(n):
if method == 'appendleft' and hasattr(collection, 'appendleft'):
collection.appendleft(i)
else:
collection.append(i)
end = time.perf_counter()
return end - start
n = 100_000
lst = []
dq = deque()
time_list_append = time_append(lst, n) # โ 0.0100 ืฉื ืืืช
time_deque_append = time_append(dq, n) # โ 0.0100 ืฉื ืืืช
time_deque_appendleft = time_append(deque(), n, 'appendleft') # โ 0.0100 ืฉื ืืืช
# list.insert(0):
lst = []
start = time.perf_counter()
for i in range(n):
lst.insert(0, i)
end = time.perf_counter()
print(f"list.insert(0): {end - start:.4f} ืฉื ืืืช") # โ 5.0000 ืฉื ืืืช
deque.appendleftืขืืื ื-O(1), ืื ืืืื ื-list.insert(0)ืฉืืื O(n).- ืืฉืชืืฉ ื-
dequeืืคืขืืืช ืชืืืคืืช ืืฉื ื ืืงืฆืืืช.
๐ง ืืืืฆืืช ืืืืฆืืขืื
| ืืฆื | ืืฉืชืืฉ ื | ืกืืื |
|---|---|---|
| ืืืกืื ืืกืคืจืื, ืืืืจืื ืงืจืืื | array.array | 2x ืคืืืช ืืืืจืื, ืืืฉื ืืืืจื ืืืชืจ |
| ื ืชืื ืื ืืืชื ื ืืชื ืื ืืฉืื ืื | tuple | ืืืืจ ืืืชืจ ื-list, ืืืื ืืืชืจ |
ืืืืงืืช ืชืืืคืืช x in collection | set / frozenset | O(1) ื ืื O(n) ืฉื list |
| ืคืขืืืืช ืืฉื ื ืืงืฆืืืช | deque | appendleft/popleft ื-O(1) |
| ื ืชืื ืื ืืืื ืื, ืืืืจืื ืงืจืืื | dataclass + __slots__ | ืืื __dict__, ืคืืืช ืืืืจืื |
| ืกืคืืจืช ืชืืืจืืืืช | Counter | ืืืชืื ืืืืจื ืื |
| ืืชื ืืืืช ืืืชืืืช ืืืฉืืช | UserList / UserDict | ืืจืืื ืืืืื ืฉื ืืืกืคืื ืืืื ืื |
๐ ืืฉืืืืช ืืืกืคืื
| ืกืื | ืืกืืืจ | ื ืืชื ืืฉืื ืื | ืืืื ืืื ืืืืืืืื | ืืืฉื ืืืื ืืงืก | ืืคืืืืืืช |
|---|---|---|---|---|---|
list | โ ืื | โ ืื | โ ืื | โ ืื | โ ืื |
tuple | โ ืื | โ ืื | โ ืื | โ ืื | โ ืื |
dict | โ ืื* | โ ืื | ืจืง ืืคืชืืืช | โ ืื | ืขืจืืื: โ |
set | โ ืื | โ ืื | โ ืื | โ ืื | โ ืื |
frozenset | โ ืื | โ ืื | โ ืื | โ ืื | โ ืื |
SimpleNamespace | โ ืื (ืืืคืืื ืื) | โ ืื | โ ืื (ืืืคืืื ืื ืืืืืื ืืืืืจ ืขื ืขืฆืื ืกืื ืืืช) | โ ืื | โ ืื |
namedtuple | โ ืื | โ ืื | โ ืื | โ ืื | โ ืื |
deque | โ ืื | โ ืื | โ ืื | โ ืื | โ ืื |
Counter | โ ืื | โ ืื | โ ืื | โ ืื (ืืื ืืฉ ืืคืชืืืช) | โ ืื |
defaultdict | โ ืื* | โ ืื | ืจืง ืืคืชืืืช | โ ืื | ืขืจืืื: โ |
dataclass | โ ืื (ืฉืืืช) | โ ืื (ืื ืื frozen) | โ ืื | โ ืื | โ ืื |
UserList | โ ืื | โ ืื | โ ืื | โ ืื | โ ืื |
UserDict | โ ืื* | โ ืื | ืจืง ืืคืชืืืช | โ ืื | ืขืจืืื: โ |
str | โ ืื | โ ืื | โ ืื | โ ืื | โ ืื |
bytes | โ ืื | โ ืื | โ ืื | โ ืื | โ ืื |
bytearray | โ ืื | โ ืื | โ ืื | โ ืื | โ ืื |
range | โ ืื | โ ืื | โ ืื | โ ืื | โ ืื |
array.array | โ ืื | โ ืื | โ ืื | โ ืื | โ ืื |
ChainMap | โ ืื* | โ ืื | ืจืง ืืคืชืืืช | โ ืื | ืขืจืืื: โ |
Enum | โ ืื | โ ืื | โ ืื (ืืืจื) | โ ืื | โ ืื |
- โ ืืื Python 3.7,
dict,defaultdict,UserDict,ChainMapืฉืืืจืื ืขื ืกืืจ ืืืื ืกื.
๐ก ืืชื ืืืฉืชืืฉ ืืื?
| ืืฉืืื | ืืืกืฃ |
|---|---|
| ืจืฆืฃ ื ืืชื ืืฉืื ืื | list / deque / UserList / bytearray |
| ื ืชืื ืื ืืืชื ื ืืชื ืื ืืฉืื ืื | tuple / namedtuple / frozenset / str / bytes |
| ืืืคืืฉ ืืืืจ, ืืกืจืช ืืคืืืืืืช | set / frozenset |
| ื ืชืื ืื ืืืื ืื | dict / dataclass / SimpleNamespace / UserDict / TypedDict |
| ื ืืชื ืืฉืืืืฉ ืืืคืชื ืืืืืื | frozenset |
ืืืืืืงืืื ืืื ืืื ืขื ืืืฉื ืืจื . | SimpleNamespace / dataclass |
| ืกืคืืจืช ืชืืืจืืืืช | Counter |
| ืขืจืื ืืจืืจืช ืืืื ืขืืืจ ืืคืชืืืช | defaultdict |
| ืคืขืืืืช ืืขืืืืช ืืงืฆืืืช | deque |
| ืืชื ืืืืช ืืืชืืืช ืืืฉืืช ืฉื ืจืฉืืื | UserList |
| ืืชื ืืืืช ืืืชืืืช ืืืฉืืช ืฉื ืืืืื | UserDict |
| ื ืชืื ืื ืืื ืืจืืื | bytes / bytearray / array.array |
| ืชืฆืืจืืช ืขื ืืืจืจืืื | ChainMap |
| ืงืืืขืื ืืขืื ืฉื | Enum |
| ืจืฆืคืื ืขืฆืื ืื | range / ืื ืจืืืจืื |