ŠšŠ¾Š½Ń‚ŠµŠ¹Š½ŠµŃ€Ń‹ 1¶

1. Šž контейнерах¶

ŠšŠ¾Š½Ń‚ŠµŠ¹Š½ŠµŃ€ — Š¾Š±ŃŠŠµŠŗŃ‚, который соГержит Š²Š½ŃƒŃ‚Ń€Šø ŃŠµŠ±Ń Š“Ń€ŃƒŠ³ŠøŠµ Š¾Š±ŃŠŠµŠŗŃ‚Ń‹. Технически все контейнеры Š½Š°ŃŠ»ŠµŠ“ŃƒŃŽŃ‚ от Collections.abc.Container метоГ __contains__. Š” ŃŃ‚ŠøŠ¼ метоГом работает оператор in.

ŠšŠ¾Š½Ń‚ŠµŠ¹Š½ŠµŃ€Ń‹ преГставлены разными ŃŃ‚Ń€ŃƒŠŗŃ‚ŃƒŃ€Š°Š¼Šø Ганных. ŠŠ° ŃŃ‚ŠøŃ… ŃŃ‚Ń€ŃƒŠŗŃ‚ŃƒŃ€Š°Ń… можно ŠæŠ¾ŃŃ‚Ń€Š¾ŠøŃ‚ŃŒ всевозможные абстрактые типы Ганных.

NB! ŠŠµ наГо ŠæŃƒŃ‚Š°Ń‚ŃŒ типы Ганных со ŃŃ‚Ń€ŃƒŠŗŃ‚ŃƒŃ€Š°Š¼Šø Ганных Šø абстрактными типами Ганных.

Тип Ганных — характеристика ŠŗŃƒŃŠ¾Ń‡ŠŗŠ° Ганных, ŠŗŠ¾Ń‚Š¾Ń€Š°Ń Š¾ŠæŃ€ŠµŠ“ŠµŠ»ŃŠµŃ‚ способ его интерпретации. ŠŠ°ŠæŃ€ŠøŠ¼ŠµŃ€, b1100001 может Š±Ń‹Ń‚ŃŒ как число 97 (целый тип), а может Š±Ń‹Ń‚ŃŒ как символ a ŠøŠ· ASCII (символ).

Š”Ń‚Ń€ŃƒŠŗŃ‚ŃƒŃ€Š° Ганных — набор ŠøŠ· примитивов Ганных Šø операций наГ ними, огранизованные Š“Š»Ń ŃŃ„Ń„ŠµŠŗŃ‚ŠøŠ²Š½Š¾Š³Š¾ Ń€ŠµŃˆŠµŠ½ŠøŃ заГачи. ŠŠ°ŠæŃ€ŠøŠ¼ŠµŃ€, массив) или ŃŠ²ŃŠ·Š½Ń‹Š¹ список.

Абстрактный тип Ганных (АТД) ā€”Ā Š¼Š°Ń‚ŠµŠ¼Š°Ń‚ŠøŃ‡ŠµŃŠŗŠ°Ń моГель ŃŃ‚Ń€ŃƒŠŗŃ‚ŃƒŃ€Ń‹ Ганных, ее интерфейс. ŠŠ°ŠæŃ€ŠøŠ¼ŠµŃ€, Š¾Ń‡ŠµŃ€ŠµŠ“ŃŒ — абстрактный тип Ганных, который можно Ń€ŠµŠ°Š»ŠøŠ·Š¾Š²Š°Ń‚ŃŒ на разных ŃŃ‚Ń€ŃƒŠŗŃ‚ŃƒŃ€Š°Ń… Ганных.

ŠŸŃ€Š¾Š±Š»ŠµŠ¼Š° ŠŗŠ¾ŠæŠøŃ€Š¾Š²Š°Š½ŠøŃ контейнеров¶

Š’ Python присваивание = ŠŗŠ¾ŠæŠøŃ€ŃƒŠµŃ‚ Ń‚Š¾Š»ŃŒŠŗŠ¾ ссылки Š¾Š±ŃŠŠµŠŗŃ‚ов. И Š¾ŠæŃ€ŠµŠ°Ń†ŠøŃŽ виГа name = obj можно ŠøŠ½Ń‚ŠµŃ€ŠæŃ€ŠµŃ‚ŠøŃ€Š¾Š²Š°Ń‚ŃŒ как присваивание Š¾Š±ŃŠŠµŠŗŃ‚Ńƒ obj имени name. Как в таком ŃŠ»ŃƒŃ‡Š°Šµ ŃŠŗŠ¾ŠæŠøŃ€Š¾Š²Š°Ń‚ŃŒ Š¾Š±ŃŠŠµŠŗŃ‚?

Š”Š»Ń примера, Гавайте ŠæŠ¾ŠæŃ€Š¾Š±ŃƒŠµŠ¼ ŃŠŗŠ¾ŠæŠøŃ€Š¾Š²Š°Ń‚ŃŒ список списков.

InĀ [1]:
# ŠŸŃ€ŠøŠ¼ŠµŃ€ списка списков
a = [1,2,3]
b = [4,5,6]
c = [a,b] # соГержит ссылки на a Šø b

Если мы список c присвоим списку d, то по Ń„Š°ŠŗŃ‚Ńƒ у списка [a,b] просто Š±ŃƒŠ“ет Гва имение c Šø d.

InĀ [2]:
# ŠŠ°Š²ŠµŃˆŠøŠ²Š°ŠµŠ¼ новое ŠøŠ¼Ń списку с (у Š¾Š±ŠµŃŠŠµŠŗŃ‚Š¾Š² Гаолжны Š±Ń‹Ń‚ŃŒ оГинаковые id)
d = c
id(c), id(d)
Out[2]:
(4508213760, 4508213760)

Можно ŃŠŗŠ¾ŠæŠøŃ€Š¾Š²Š°Ń‚ŃŒ список, созГав ŃŠ²Š½Š¾ новый с соГержимым старого. ŠŸŃ€Šø ŃŃ‚Š¾Š¼ происхоГит поверхностное копирование списка. Элементы ŃƒŠŗŠ°Š·Ń‹Š²Š°ŃŽŃ‚ на ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Ń‹ старого списка.

InĀ [3]:
# ŠŸŠ¾Š²ŠµŃ€Ń…Š½Š¾ŃŃ‚Š½Š¾Šµ копирование списка (списки разные, но Š²Š½ŃƒŃ‚ренние Š¾Š±ŃŠŠµŠŗŃ‚Ń‹ нет)
d = list(c)
id(c), id(d), id(c[0]), id(d[0])
Out[3]:
(4508213760, 4508896768, 4507249728, 4507249728)

Š Š°Š·Š»ŠøŃ‡Š°ŃŽŃ‚ Гва типа ŠŗŠ¾ŠæŠøŃ€Š¾Š²Š°Š½ŠøŃ:

  • ŠŸŠ¾Š²ŠµŃ€Ń…Š½Š¾ŃŃ‚Š½Š¾Šµ (англ. shallow)
  • Š“Š»ŃƒŠ±Š¾ŠŗŠ¾Šµ (англ. deep)

Š’ отличии от поверхностного ŠŗŠ¾ŠæŠøŃ€Š¾Š²Š°Š½ŠøŃ, глубокое обхоГит Š¾Š±ŃŠŠµŠŗŃ‚ Ń€ŠµŠŗŃƒŃ€ŃŠøŠ²Š½Š¾ Šø ŠŗŠ¾ŠæŠøŃ€ŃƒŠµŃ‚ все ŠæŠ¾Š“Š¾Š±ŃŠŠµŠŗŃ‚Ń‹.

InĀ [4]:
# Š“Š»ŃƒŠ±Š¾ŠŗŠ¾Šµ копирование списка
from copy import deepcopy
d = deepcopy(c)
id(c), id(d), id(c[0]), id(d[0])
Out[4]:
(4508213760, 4507242880, 4507249728, 4508854144)

2. Built-in контейнеры¶

Встроенные в Python-контейнеры можно Ń€Š°Š·Š“ŠµŠ»ŠøŃ‚ŃŒ на Гве категории:

  • Š½ŠµŠøŠ·Š¼ŠµŠ½ŃŠµŠ¼Ń‹Šµ (англ. immutable) string, tuple, range, frozenset, bytes
  • ŠøŠ·Š¼ŠµŠ½ŃŠµŠ¼Ń‹Šµ (англ. mutable) list, dict, set, bytearray
InĀ [5]:
# Встроенные контейнеры:
c_str = "Š•Š“Ńƒ в магазин в гороГе Данкт-ŠŸŠµŃ‚ŠµŃ€Š±ŃƒŃ€Š³Šµ"
c_tpl = (1, 1.2, "я")
c_rng = range(10)
c_fst = frozenset({1,2,3}) # readonly set
c_bts = bytes((3,1,4,5,1,5))
c_lst = [1,2,3]
c_dct = {1: "Sex", 2: "Drugs", 3: "Rock-and-Roll"}
c_set = {1,2,3}
c_bar = bytearray((3,1,4,5,1,5)) # writable bytes

Šž сложности операций наГ ŠæŠ¾ŠæŃƒŠ»ŃŃ€Š½Ń‹Š¼Šø контейнерами¶

Š’ таблице привеГены некоторые ŠæŠ¾ŠæŃƒŠ»ŃŃ€Š½Ń‹Šµ встроенные контейнеры Šø некоторые операции наГ ними с асимптотической ŃŠ»Š¾Š¶Š½Š¾ŃŃ‚ŃŒŃŽ.

ŠšŠ¾Š½Ń‚ŠµŠ¹Š½ŠµŃ€ List Tuple Dictionary Set
ŠŸŃƒŃŃ‚Š¾Š¹ контейнер [] $O(1)$ () $O(1)$ {} $O(1)$ Set() или {()} $O(1)$
ŠŸŃ€Š¾Ń‡ŠøŃ‚Š°Ń‚ŃŒ ŃŠ»ŠµŠ¼ŠµŠ½Ń‚ l[i] $O(1)$ t[i] $O(1)$ d[key] $O(1)$ undefined undefined
Š”Š¾Š±Š°Š²ŠøŃ‚ŃŒ ŃŠ»ŠµŠ¼ŠµŠ½Ń‚ l.append(5) $O(1)$ undefined undefined d[key]=5 $O(1)$ s.add(5) $O(1)$
Š£Š“Š°Š»ŠøŃ‚ŃŒ ŃŠ»ŠµŠ¼ŠµŠ½Ń‚ del l[i] $O(N)$ undefined undefined del d[key] $O(1)$ s.discard(5) $O(1)$

Šž Ń…ŃŃˆŠøŃ€ŃƒŠµŠ¼Š¾ŃŃ‚ŠøĀ¶

ŠžŠ±ŃŠŠµŠŗŃ‚Ń‹ в Python Š¼Š¾Š³ŃƒŃ‚ Š±Ń‹Ń‚ŃŒ Ń…ŃŃˆŠøŃƒŃ€ŃƒŠµŠ¼Ń‹Šµ — таким Š¾Š±ŃŠŠµŠŗŃ‚ам ŃŠ¾ŠæŠ¾ŃŃ‚Š°Š²Š»ŃŠµŃ‚ŃŃ некоторое число (хэш), которое не Š¼ŠµŠ½ŃŠµŃ‚ся в течении ŃŃƒŃ‰ŠµŃŃ‚Š²Š¾Š²Š°Š½ŠøŃ Š¾Š±ŃŠŠµŠŗŃ‚Š°. Š„ŃŃˆŠø ŠøŃŠæŠ¾Š»ŃŒŠ·ŃƒŃŽŃ‚ŃŃ Š“Š»Ń ŃŃ€Š°Š²Š½ŠµŠ½ŠøŃ ŠŗŠ»ŃŽŃ‡ŠµŠ¹ в ŃŠ»Š¾Š²Š°Ń€ŃŃ… Šø множествах. Технически, у Ń…ŃŃˆŠøŃ€ŃƒŠµŠ¼Ń‹Ń… Š¾Š±ŃŠŠµŠŗŃ‚Š¾Š² реализован метоГ __hash__().

NB! Если контейнер Šø его ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Ń‹ Š½ŠµŠøŠ·Š¼ŠµŠ½ŃŠµŠ¼Ń‹Šµ, то он Ń…ŃŃˆŠøŃ€ŃƒŠµŠ¼Ń‹Š¹.

InĀ [6]:
# Š„ŃŃˆŠøŃ€ŃƒŠµŠ¼Ń‹Š¹ кортеж
hash((1,3,()))
Out[6]:
7764519317587398582
InĀ [7]:
# ŠŠµŃ…ŃŃˆŠøŃ€ŃƒŠµŠ¼Ń‹Š¹ кортеж (Голжна Š±Ń‹Ń‚ŃŒ ошибка)
hash((1,3,[]))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-cbf3b29f821f> in <module>
      1 # ŠŠµŃ…ŃŃˆŠøŃ€ŃƒŠµŠ¼Ń‹Š¹ кортеж (Голжна Š±Ń‹Ń‚ŃŒ ошибка)
----> 2 hash((1,3,[]))

TypeError: unhashable type: 'list'

3. ŠšŃ€ŃƒŃ‚Ń‹Šµ контейнеры¶

ŠŠøŠ¶Šµ привеГены некоторые контейнеры ŠøŠ· станГартной библиотеки со ŃŠæŠµŃ†ŠøŠ°Š»ŃŒŠ½Ń‹Š¼ назначением.

namedtuple — когГа нужен Ā«ŃŠøŃˆŠ½Ń‹Š¹ struct»¶

InĀ [8]:
# ŠŸŃ€ŠøŠ¼ŠµŃ€ именованного кортежа
from collections import namedtuple 
Point = namedtuple('Point', ['x', 'y'])
p = Point(1,2)
InĀ [9]:
# К ŠæŠ¾Š»ŃŠ¼ namedtuple можно Š¾Š±Ń€Š°Ń‰Š°Ń‚ŃŒŃŃ через Ń‚Š¾Ń‡ŠŗŃƒ.
p.x
Out[9]:
1
InĀ [10]:
# Также можно Ń‡ŠøŃ‚Š°Ń‚ŃŒ как обычный кортеж.
p[0]
Out[10]:
1
InĀ [11]:
# Š˜Ń‚ŠµŃ€ŠøŃ€Š¾Š²Š°Š½ŠøŠµ по именованному ŠŗŠ¾Ń€Ń‚ŠµŠ¶Ńƒ
for x in p:
    print(x)
1
2
InĀ [12]:
# Š˜Š¼ŠµŠ½Š¾Š²Š°Š½Š½Ń‹Š¹ кортеж ā€”Ā Š½ŠµŠøŠ·Š¼ŠµŠ½ŃŠµŠ¼Ń‹Š¹ Š¾Š±ŃŠŠµŠŗŃ‚ (Голжна Š±Ń‹Ń‚ŃŒ ошибка)
p.x = 4
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-12-4ffc5fe135f6> in <module>
      1 # Š˜Š¼ŠµŠ½Š¾Š²Š°Š½Š½Ń‹Š¹ кортеж ā€”Ā Š½ŠµŠøŠ·Š¼ŠµŠ½ŃŠµŠ¼Ń‹Š¹ Š¾Š±ŃŠŠµŠŗŃ‚ (Голжна Š±Ń‹Ń‚ŃŒ ошибка)
----> 2 p.x = 4

AttributeError: can't set attribute

NB! namedtuple уГобно ŠøŃŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Ń‚ŃŒ Š“Š»Ń возврата Ганных ŠøŠ· Ń„ŃƒŠ½ŠŗŃ†ŠøŠ¹.

OrderedDict — когГа важен ŠæŠ¾Ń€ŃŠ“Š¾Šŗ в словаре¶

Update: Š’ Python 3.7 уже не Š°ŠŗŃ‚ŃƒŠ°Š»ŃŒŠ½Š¾. ДтанГартный dict Š³Š°Ń€Š°Š½Ń‚ŠøŃ€ŃƒŠµŃ‚ ŠæŠ¾Ń€ŃŠ“Š¾Šŗ.

dict не Š³Š°Ń€Š°Š½Ń‚ŠøŃ€ŃƒŠµŃ‚, что Š±ŃƒŠ“ет Ń…Ń€Š°Š½ŠøŃ‚ŃŒ ŠŗŠ»ŃŽŃ‡Šø в том ŠæŠ¾Ń€ŃŠ“ŠŗŠµ, в котором вы ŠøŃ… заГали. Если важно ŠæŠ¾Š»ŃƒŃ‡ŠøŃ‚ŃŒ ŠøŠ· d.keys() Š¾Ń€ŠøŠ³ŠøŠ½Š°Š»ŃŒŠ½Ń‹Š¹ ŠæŠ¾Ń€ŃŠ“Š¾Šŗ, то Š“Š»Ń ŃŃ‚Š¾Š³Š¾ ŠµŃŃ‚ŃŒ OrderedDict.

InĀ [13]:
# ŠžŠæŠµŃ€Š°Ń†ŠøŃ реверса на словаре бесмысленна — ŠæŠ¾Ń€ŃŠ“ŠŗŠ° нет (Голжна Š±Ń‹Ń‚ŃŒ ошибка)
dict_std = {"a": 1, "b": 2, "c": 3}
[k for k in reversed(dict_std)]
Out[13]:
['c', 'b', 'a']
InĀ [14]:
# Рабочий workaround в Python 3.7+
dict_std = {"a": 1, "b": 2, "c": 3}
[k for k in reversed(list(dict_std.keys()))]
Out[14]:
['c', 'b', 'a']
InĀ [15]:
# OrderedDict преГполагает наличие ŠæŠ¾Ń€ŃŠ“ŠŗŠ°, можно ŠæŠµŃ€ŠµŠ²ŠµŃ€Š½ŃƒŃ‚ŃŒ
from collections import OrderedDict 
dict_odr = OrderedDict({"a": 1, "b": 2, "c": 3})
[k for k in reversed(dict_odr)]
Out[15]:
['c', 'b', 'a']

defaultdict — когГа лень ŠøŠ½ŠøŃ†ŠøŠ°Š»ŠøŠ·ŠøŃ€Š¾Š²Š°Ń‚ŃŒ ŠŗŠ»ŃŽŃ‡ŠøĀ¶

Если Š¾Š±Ń€Š°Ń‚ŠøŃ‚ŃŒŃŃ Šŗ ŠŗŠ»ŃŽŃ‡Ńƒ ŃŠ»Š¾Š²Š°Ń€Ń, которого нет, то Š±ŃƒŠ“ет ошибка.

InĀ [16]:
# ŠžŠ±Ń‹Ń‡Š½Ń‹Š¹ ŃŠ»Š¾Š²Š°Ń€ŃŒ Ń€ŃƒŠ³Š°ŠµŃ‚ŃŃ на ŠæŠ¾Š»Ń, которых нет (Голжна Š±Ń‹Ń‚ŃŒ ошибка)
d = {}
d["4"]
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-16-c9aa461dd7f1> in <module>
      1 # ŠžŠ±Ń‹Ń‡Š½Ń‹Š¹ ŃŠ»Š¾Š²Š°Ń€ŃŒ Ń€ŃƒŠ³Š°ŠµŃ‚ŃŃ на ŠæŠ¾Š»Ń, которых нет (Голжна Š±Ń‹Ń‚ŃŒ ошибка)
      2 d = {}
----> 3 d["4"]

KeyError: '4'

Если наГо какое-то повеГение по-ŃƒŠ¼Š¾Š»Ń‡Š°Š½ŠøŃŽ, то Š“Š»Ń ŃŃ‚Š¾Š³Š¾ уГобно ŠøŃŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Ń‚ŃŒ defaultdict.

InĀ [17]:
# ŠŸŃ€ŠøŠ¼ŠµŃ€ с defaultdict, ŠŗŠ»ŃŽŃ‡Ńƒ по-ŃƒŠ¼Š¾Š»Ń‡Š°Š½ŠøŃŽ ŠæŃ€ŠøŃŠ²Š°ŠµŃ‚ŃŃ 0.
from collections import defaultdict

s = 'я Š·Š°Š»ŠøŠ²Š°ŃŽ глаза керосином'
d = defaultdict(int)

for k in s:
    d[k] += 1 # без defaultdict зГесь наГо было  бы ŠøŠ½ŠøŃ†ŠøŠ°Š»ŠøŠ·ŠøŃ€Š¾Š²Š°Ń‚ŃŒ ŠŗŠ»ŃŽŃ‡Šø ŃŠ²Š½Š¾

sorted(d.items(), key=lambda x: x[1], reverse=True)
Out[17]:
[('а', 4),
 (' ', 3),
 ('Š·', 2),
 ('Š»', 2),
 ('Šø', 2),
 ('о', 2),
 ('я', 1),
 ('в', 1),
 ('ю', 1),
 ('г', 1),
 ('Šŗ', 1),
 ('е', 1),
 ('р', 1),
 ('с', 1),
 ('н', 1),
 ('м', 1)]

ChainMap — когГа нужно несколько словарей ŠæŃ€ŠµŠ“ŃŃ‚Š°Š²ŠøŃ‚ŃŒ как оГин¶

ChainMap хранит ссылки на Š“Ń€ŃƒŠ³ŠøŠµ словари. ŠšŠ¾Š½Ń‚ŠµŠ¹Š½ŠµŃ€ ŠæŠ¾Š·Š²Š¾Š»ŃŠµŃ‚ Ń€Š°Š±Š¾Ń‚Š°Ń‚ŃŒ с Š²Š½ŃƒŃ‚Ń€ŠµŠ½Š½ŠøŠ¼Šø ŃŠ»Š¾Š²Š°Ń€ŃŠ¼Šø как с оГним целым словарем.

Š£ ChainMap ŠµŃŃ‚ŃŒ Гва траГиционных ŠæŃ€ŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ:

  • Š’Š¾Š·Š²Ń€Š°Ń‰Š°Ń‚ŃŒ Š·Š½Š°Ń‡ŠµŠ½ŠøŃ по-ŃƒŠ¼ŠæŠ¾Š»Ń‡Š°Š½ŠøŃŽ ŠøŠ· ŃŠ»Š¾Š²Š°Ń€Ń, если ŠŗŠ»ŃŽŃ‡Š° нет.
  • Поиск по Š½ŠµŃŠŗŠ¾Š»ŃŒŠŗŠøŃ… ŃŠ»Š¾Š²Š°Ń€ŃŠ¼.
InĀ [18]:
# ŠŸŃ€ŠøŠ¼ŠµŃ€ с ChainMap: поиск по Гвум ŃŠ»Š¾Š²Š°Ń€ŃŠ¼
from collections import ChainMap

group1 = {"a": 1, "b": 2}
group2 = {"c": 3, "d": 4}
groups = ChainMap(group1, group2)
groups["d"], groups["b"]
Out[18]:
(4, 2)

Š—Š“ŠµŃŃŒ group1 может Š±Ń‹Ń‚ŃŒ словарём параметров, а group2 — словарём значений параметров по-ŃƒŠ¼Š¾Š»Ń‡Š°Š½ŠøŃŽ. Если Š·Š½Š°Ń‡ŠµŠ½ŠøŃ нет в group1, то Š²ŠµŃ€Š½Ń‘Ń‚ŃŃ значение ŠøŠ· group2.

MappingProxyType — когГа нужен ŃŠ»Š¾Š²Š°Ń€ŃŒ Ń‚Š¾Š»ŃŒŠŗŠ¾ Š“Š»Ń Ń‡Ń‚ŠµŠ½ŠøŃĀ¶

InĀ [19]:
# ŠŸŃ€ŠøŠ¼ŠµŃ€ ŃŠ»Š¾Š²Š°Ń€Ń, в который Š½ŠµŠ»ŃŒŠ·Ń ŠæŠøŃŠ°Ń‚ŃŒ
from types import MappingProxyType

d = {"a": 1, "b": 2} # ŠžŠ±Ń‹Ń‡Š½Ń‹Š¹ ŃŠ»Š¾Š²Š°Ń€ŃŒ
d_ro = MappingProxyType(d) # MappingProxyType (Read Only)

d_ro["a"]
Out[19]:
1
InĀ [20]:
# Š—Š°ŠæŠøŃŠ°Ń‚ŃŒ в MappingProxyType Š½ŠµŠ»ŃŒŠ·Ń (Голжна Š±Ń‹Ń‚ŃŒ ошибка)
d_ro["a"] = 1
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-20-819d3d450b91> in <module>
      1 # Š—Š°ŠæŠøŃŠ°Ń‚ŃŒ в MappingProxyType Š½ŠµŠ»ŃŒŠ·Ń (Голжна Š±Ń‹Ń‚ŃŒ ошибка)
----> 2 d_ro["a"] = 1

TypeError: 'mappingproxy' object does not support item assignment

Counter — когГа наГо Š¼ŃƒŠ»ŃŒŃ‚имножество¶

ŠœŃƒŠ»ŃŒŃ‚ŠøŠ¼Š½Š¾Š¶ŠµŃŃ‚Š²Š¾ — множество, ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Ń‹ в котором Š¼Š¾Š³ŃƒŃ‚ ŠæŠ¾Š²Ń‚Š¾Ń€ŃŃ‚ŃŒŃŃ.

InĀ [21]:
# ŠŸŃ€ŠøŠ¼ŠµŃ€ ŠæŠ¾ŃŃ‚Ń€Š¾ŠµŠ½ŠøŃ Š¼ŃƒŠ»ŃŒŃ‚ŠøŠ¼Š½Š¾Š¶ŠµŃŃ‚Š²Š° по ŠøŃ‚ŠµŃ€ŠøŃ€ŃƒŠµŠ¼Š¾Š¼Ńƒ Š¾Š±ŃŠŠµŠŗŃ‚Ńƒ (строке)
from collections import Counter

s = 'я Š·Š°Š»ŠøŠ²Š°ŃŽ глаза керосином'
c = Counter(s)
c
Out[21]:
Counter({'я': 1,
         ' ': 3,
         'Š·': 2,
         'а': 4,
         'Š»': 2,
         'Šø': 2,
         'в': 1,
         'ю': 1,
         'г': 1,
         'Šŗ': 1,
         'е': 1,
         'р': 1,
         'о': 2,
         'с': 1,
         'н': 1,
         'м': 1})
InĀ [22]:
# sum — количество ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š¾Š² в множестве, 
# len - количество ŃƒŠ½ŠøŠŗŠ°Š»ŃŒŠ½Ń‹Ń… ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š¾Š² в множестве
sum(c.values()), len(c.values())
Out[22]:
(25, 16)

deque — когГа нужен Š“Š²ŃƒŃŃ‚Š¾Ń€Š¾Š½Š½ŠøŠ¹ Š“Š¾ŃŃ‚ŃƒŠæĀ¶

И Š¾Ń‡ŠµŃ€ŠµŠ“ŃŒ Šø стек можно Ń€ŠµŠ°Š»ŠøŠ·Š¾Š²Š°Ń‚ŃŒ на list. ŠŠ¾ list реализован на Гинамическом массиве, а deque на ŃŠ²ŃŠ·Š½Š¾Š¼ списке.

InĀ [23]:
# ŠŸŃ€ŠøŠ¼ŠµŃ€ Š“Š²ŃƒŃŃ‚Š¾Ń€Š¾Š½Š½ŠµŠ¹ очереГи
from collections import deque
d = deque()
d.append("я")
d.append("иГу")
d.append("Š±Ń€Š°Ń‚ŃŒ")
d.append("Š»ŃƒŃ‚")
d.popleft(), d.pop()
Out[23]:
('я', 'Š»ŃƒŃ‚')

heapq — когГа нужна Š¾Ń‡ŠµŃ€ŠµŠ“ŃŒ с приоритетом¶

InĀ [24]:
# ŠŸŃ€ŠøŠ¼ŠµŃ€
from heapq import heappush, heappop

q = []
heappush(q, (3, "ŠŸŃ€Š¾Š“Š°ŠŗŃˆŠµŠ½"))
heappush(q, (1, "Чпок"))
heappush(q, (2, "Чпок"))

heappop(q),heappop(q),heappop(q)
Out[24]:
((1, 'Чпок'), (2, 'Чпок'), (3, 'ŠŸŃ€Š¾Š“Š°ŠŗŃˆŠµŠ½'))

dataclasses — когГа от класса наГо Ń‚Š¾Š»ŃŒŠŗŠ¾ хранение Ганных¶

КогГа нужен ŠøŠ·Š¼ŠµŠ½ŃŠµŠ¼Ń‹Š¹ namedtuple, то поГхоГит dataclasses.

InĀ [25]:
# ŠŸŃ€ŠøŠ¼ŠµŃ€ с собственным dataclass
from dataclasses import dataclass

@dataclass
class Structure:
    name: str
    value: float

    @property
    def square(self) -> float:
        return self.value * self.value
    
s = Structure("я", 2)
s.square
Out[25]:
4

По-ŃƒŠ¼Š¾Š»Ń‡Š°Š½ŠøŃŽ dataclass Š³ŠµŠ½ŠµŃ€ŠøŃ€ŃƒŠµŃ‚ 3 ГанГер-метоГа (метоГ с Гвойным поГчеркиванием):

  • init,
  • repr,
  • eq.

Через опции Гекоратора можно ŃŠ“ŠµŠ»Š°Ń‚ŃŒ dataclass immutable (frozen), mutable-Ń…ŃŃˆŠøŃ€ŃƒŠµŠ¼Ń‹Š¼ (unsafe_hash) Šø сравниваемым (order).

title

InĀ [26]:
%load_ext watermark
%watermark -d -u -v -iv
last updated: 2019-10-21 

CPython 3.8.0
IPython 7.8.0