Skip to content
> ๐Ÿ’ป ๐Ÿง  ืงื•ื“ 1001 > > ๐Ÿ Python > ๐Ÿ“˜ ืื•ืกืคื™ื ื‘-Python

๐Ÿ“˜ ืื•ืกืคื™ื ื‘-Python

ื‘-Python, ืื•ืกืฃ ื”ื•ื ืื•ื‘ื™ื™ืงื˜ ื”ืžื›ื™ืœ ืงื‘ื•ืฆื” ืฉืœ ืืœืžื ื˜ื™ื ื•ืžืืคืฉืจ ืœืขื‘ื•ื“ ืื™ืชื ื›ื™ื—ื™ื“ื” ืื—ืช.

ืื•ืกืคื™ื ืชื•ืžื›ื™ื ื‘ื“ืจืš ื›ืœืœ ื‘:

  • ืื™ื˜ืจืฆื™ื” (for item in collection)
  • ื‘ื“ื™ืงืช ืฉื™ื™ื›ื•ืช (x in collection)
  • ืงื‘ื™ืขืช ืื•ืจืš (len(collection))
  • ื’ื™ืฉื” ื‘ืืžืฆืขื•ืช ืื™ื ื“ืงืก ืื• ืžืคืชื— (ืื ืžืกื•ื“ืจื™ื ืื• ืืกื•ืฆื™ืื˜ื™ื‘ื™ื™ื)

ื‘-Python ืื™ืŸ "ืžืžืฉืง ืื•ืกืฃ" ืจืฉืžื™, ืืš ืงื™ื™ืžื™ื ืคืจื•ื˜ื•ืงื•ืœื™ื ืœื ืจืฉืžื™ื™ื. ืื ืื•ื‘ื™ื™ืงื˜ ืžืžืžืฉ __iter__, __len__, __contains__ โ€” ื ื™ืชืŸ ืœื”ื—ืฉื™ื‘ื• ื›ืื•ืกืฃ.


In Questo Articolo
  1. ืžื” ืฉืื™ื ื ื• ืื•ืกืฃ
  2. ืื•ืกืคื™ื ืžื•ื‘ื ื™ื
  3. ืื•ืกืคื™ื ืžื•ืจื—ื‘ื™ื ืžื”ืกืคืจื™ื™ื” ื”ืกื˜ื ื“ืจื˜ื™ืช
  4. ืกื•ื’ื™ื ื“ืžื•ื™ื™ ืื•ืกืฃ ื ื•ืกืคื™ื
  5. 1. ืจืฉื™ืžื•ืช โ€” list
  6. 2. ืžื™ืœื•ื ื™ื โ€” dict
  7. 3. ื˜ืืคืœื™ื โ€” tuple
  8. 4. SimpleNamespace
  9. 5. ืงื‘ื•ืฆื•ืช โ€” set
  10. 6. ืงื‘ื•ืฆื•ืช ื‘ืœืชื™ ื ื™ืชื ื•ืช ืœืฉื™ื ื•ื™ โ€” frozenset
  11. 7. namedtuple โ€” ื˜ืืคืœื™ื ื‘ืขืœื™ ืฉื
  12. 8. deque โ€” ืชื•ืจ ื“ื•-ืฆื“ื“ื™
  13. 9. Counter โ€” ืกื•ืคืจ ืืœืžื ื˜ื™ื
  14. 10. defaultdict โ€” ืžื™ืœื•ืŸ ืขื ืขืจื›ื™ ื‘ืจื™ืจืช ืžื—ื“ืœ
  15. 11. dataclass โ€” ืžื—ืœืงื•ืช ื ืชื•ื ื™ื
  16. 12. UserList โ€” ืจืฉื™ืžื•ืช ืžื•ืชืืžื•ืช ืื™ืฉื™ืช
  17. 13. UserDict โ€” ืžื™ืœื•ื ื™ื ืžื•ืชืืžื™ื ืื™ืฉื™ืช
  18. ๐Ÿ“ˆ ื”ืฉื•ื•ืืช ื–ื™ื›ืจื•ืŸ ื•ื‘ื™ืฆื•ืขื™ื
  19. ๐Ÿง  ื”ืžืœืฆื•ืช ืœื‘ื™ืฆื•ืขื™ื
  20. ๐Ÿ“Š ื”ืฉื•ื•ืืช ืื•ืกืคื™ื
  21. ๐Ÿ’ก ืžืชื™ ืœื”ืฉืชืžืฉ ื‘ืžื”?

ืžื” ืฉืื™ื ื ื• ืื•ืกืฃ

ื”ืกื•ื’ื™ื ื”ื‘ืื™ื ืื™ื ื ืื•ืกืคื™ื, ืžื›ื™ื•ื•ืŸ ืฉืื™ื ื ืžื›ื™ืœื™ื ืงื‘ื•ืฆื•ืช ืฉืœ ืืœืžื ื˜ื™ื:

  • int, float, bool โ€” ืขืจื›ื™ื ืกืงืœืจื™ื™ื
  • None โ€” ื”ืขื“ืจ ืขืจืš
  • ืคื•ื ืงืฆื™ื•ืช, ืžื•ื“ื•ืœื™ื, ืžื—ืœืงื•ืช โ€” ืืœื• ืื•ื‘ื™ื™ืงื˜ื™ื, ืืš ืœื ืžื™ื›ืœื™ ื ืชื•ื ื™ื (ืืœื ืื ื›ืŸ ืžื›ื™ืœื™ื __dict__)

ืื•ืกืคื™ื ืžื•ื‘ื ื™ื

ื–ืžื™ื ื™ื ืœืœื ื™ื™ื‘ื•ื:

ืกื•ื’ืชื™ืื•ืจ
listืจืฆืฃ ืžืกื•ื“ืจ, ื ื™ืชืŸ ืœืฉื™ื ื•ื™.
tupleืจืฆืฃ ืžืกื•ื“ืจ, ื‘ืœืชื™ ื ื™ืชืŸ ืœืฉื™ื ื•ื™.
dictืžื™ืคื•ื™ ืžืคืชื—-ืขืจืš ืžืกื•ื“ืจ (ืžืื– Python 3.7).
setืื•ืกืฃ ืœื ืžืกื•ื“ืจ ืฉืœ ืืœืžื ื˜ื™ื ื™ื™ื—ื•ื“ื™ื™ื.
frozensetื’ืจืกื” ื‘ืœืชื™ ื ื™ืชื ืช ืœืฉื™ื ื•ื™ ืฉืœ set.

ืื•ืกืคื™ื ืžื•ืจื—ื‘ื™ื ืžื”ืกืคืจื™ื™ื” ื”ืกื˜ื ื“ืจื˜ื™ืช

ืกื•ื’ืžื•ื“ื•ืœื™ืขื“
SimpleNamespacetypesืื•ื‘ื™ื™ืงื˜ ืขื ืžืืคื™ื™ื ื™ื ื“ื™ื ืžื™ื™ื (ื—ืœื•ืคื” ืœืžื™ืœื•ืŸ ืขื ื’ื™ืฉื” ื“ืจืš .).
namedtuplecollectionsื˜ืืคืœ ื‘ืœืชื™ ื ื™ืชืŸ ืœืฉื™ื ื•ื™ ืขื ืฉื“ื•ืช ื‘ืขืœื™ ืฉื.
dequecollectionsืชื•ืจ ื“ื•-ืฆื“ื“ื™ โ€” ื™ืขื™ืœ ืœืคืขื•ืœืช ื”ื•ืกืคื”/ืžื—ื™ืงื” ืžืฉื ื™ ื”ืงืฆื•ื•ืช.
Countercollectionsืชืช-ืžื—ืœืงื” ืฉืœ ืžื™ืœื•ืŸ ืœืกืคื™ืจืช ืื•ื‘ื™ื™ืงื˜ื™ื ื”ื’ื™ื‘ื•ืœื™ื™ื.
defaultdictcollectionsืžื™ืœื•ืŸ ืขื ืขืจื›ื™ ื‘ืจื™ืจืช ืžื—ื“ืœ ืขื‘ื•ืจ ืžืคืชื—ื•ืช ื—ืกืจื™ื.
dataclassdataclassesืžื™ื™ืฆืจ ืื•ื˜ื•ืžื˜ื™ืช __init__, __repr__, __eq__ ื•ื›ื•'.
UserListcollectionsืžื—ืœืงื” ื‘ืกื™ืกื™ืช ืœืื•ื‘ื™ื™ืงื˜ื™ื ื“ืžื•ื™ื™ ืจืฉื™ืžื” ืžื•ืชืืžื™ื ืื™ืฉื™ืช.
UserDictcollectionsืžื—ืœืงื” ื‘ืกื™ืกื™ืช ืœืื•ื‘ื™ื™ืงื˜ื™ื ื“ืžื•ื™ื™ ืžื™ืœื•ืŸ ืžื•ืชืืžื™ื ืื™ืฉื™ืช.

ืกื•ื’ื™ื ื“ืžื•ื™ื™ ืื•ืกืฃ ื ื•ืกืคื™ื

ืœืžืจื•ืช ืฉืœื ืชืžื™ื“ ื ืงืจืื™ื "ืื•ืกืคื™ื", ื”ืกื•ื’ื™ื ื”ื‘ืื™ื ื’ื ื›ืŸ ืžื™ื™ืฆื’ื™ื ืื• ืžืื—ืกื ื™ื ืงื‘ื•ืฆื•ืช ืฉืœ ื ืชื•ื ื™ื.

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.array2x ืคื—ื•ืช ื–ื™ื›ืจื•ืŸ, ื’ื™ืฉื” ืžื”ื™ืจื” ื™ื•ืชืจ
ื ืชื•ื ื™ื ื‘ืœืชื™ ื ื™ืชื ื™ื ืœืฉื™ื ื•ื™tupleืžื”ื™ืจ ื™ื•ืชืจ ืž-list, ื‘ื˜ื•ื— ื™ื•ืชืจ
ื‘ื“ื™ืงื•ืช ืชื›ื•ืคื•ืช x in collectionset / frozensetO(1) ื ื’ื“ O(n) ืฉืœ list
ืคืขื•ืœื•ืช ื‘ืฉื ื™ ื”ืงืฆื•ื•ืชdequeappendleft/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 / ื’ื ืจื˜ื•ืจื™ื

ื›ืชื™ื‘ืช ืชื’ื•ื‘ื”

ื”ืื™ืžื™ื™ืœ ืœื ื™ื•ืฆื’ ื‘ืืชืจ. ืฉื“ื•ืช ื”ื—ื•ื‘ื” ืžืกื•ืžื ื™ื *