Сортировка списка с элементами
Попытка сортировки приведёт к ошибке:
Можно удалить
Это громоздко. Лучше использовать более сложную функцию ключа:
Если тип данных не поддерживает бесконечность (
📲 Мы в MAX
👉@BookPython
None может быть затруднительной:
In [1]: data = [
...: dict(a=1),
...: None,
...: dict(a=-3),
...: dict(a=2),
...: None,
...: ]
Попытка сортировки приведёт к ошибке:
In [2]: sorted(data, key=lambda x: x['a'])
---------------------------------------------------------------------------
TypeError: 'NoneType' object is not subscriptable
Можно удалить
None перед сортировкой, а затем добавить их обратно (в конец или начало списка — в зависимости от задачи):
In [3]: sorted(
...: (d for d in data if d is not None),
...: key=lambda x: x['a']
...: ) + [
...: d for d in data if d is None
...: ]
Out[3]: [{'a': -3}, {'a': 1}, {'a': 2}, None, None]
Это громоздко. Лучше использовать более сложную функцию ключа:
In [4]: sorted(data, key=lambda x: float('inf') if x is None else x['a'])
Out[4]: [{'a': -3}, {'a': 1}, {'a': 2}, None, None]
Если тип данных не поддерживает бесконечность (
float('inf')), можно сортировать кортежи:
In [5]: sorted(data, key=lambda x: (1, None) if x is None else (0, x['a']))
Out[5]: [{'a': -3}, {'a': 1}, {'a': 2}, None, None]
👉@BookPython
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1
Когда вы используете
Чтобы избежать этого, необходимо вручную вызывать
Однако, если вы используете модуль
Пример:
Вывод будет примерно такой:
Причём, начиная с Python 3.7,
Так что в Python 3.7+ вывод кода выше может быть таким:
📲 Мы в MAX
👉@BookPython
fork для создания нового процесса, текущее состояние генератора случайных чисел (включая seed) копируется в дочерний процесс. Это может привести к тому, что разные процессы будут генерировать одинаковые «случайные» значения.Чтобы избежать этого, необходимо вручную вызывать
random.seed() в каждом процессе.Однако, если вы используете модуль
multiprocessing, он уже автоматически выполняет это за вас.Пример:
import multiprocessing
import random
import os
import sys
def test(a):
print(random.choice(a), end=' ')
a = [1, 2, 3, 4, 5]
# Вызов в основном процессе
for _ in range(5):
test(a)
print()
# Вызов с multiprocessing.Process
for _ in range(5):
p = multiprocessing.Process(
target=test, args=(a,)
)
p.start()
p.join()
print()
# Вызов с использованием os.fork
for _ in range(5):
pid = os.fork()
if pid == 0:
test(a)
sys.exit()
else:
os.wait()
print()
Вывод будет примерно такой:
4 4 4 5 5
1 4 1 3 3
2 2 2 2 2
Причём, начиная с Python 3.7,
os.fork также использует механизм at_fork hook, который переинициализирует генератор случайных чисел, как и multiprocessing.Так что в Python 3.7+ вывод кода выше может быть таким:
1 2 2 1 5
4 4 4 5 5
2 4 1 3 1
👉@BookPython
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Скажем, вы хотите получить первые N элементов итерируемого объекта. Прямолинейный способ — использовать
Если вы также хотите получить индексы элементов, можно применить
Другой способ сделать это — использовать
📲 Мы в MAX
👉@BookPython
islice:
from itertools import islice
def fib():
a, b = 0, 1
while True:
yield b
a, b = b, (a + b)
list(islice(fib(), 5))
# Результат: [1, 1, 2, 3, 5]
Если вы также хотите получить индексы элементов, можно применить
enumerate:
list(enumerate(islice(fib(), 5)))
# Результат: [(0, 1), (1, 1), (2, 2), (3, 3), (4, 5)]
Другой способ сделать это — использовать
zip и range, что может показаться более читаемым:
list(zip(range(5), fib()))
# Результат: [(0, 1), (1, 1), (2, 2), (3, 3), (4, 5)]
👉@BookPython
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
collections.defaultdict позволяет создать словарь, который возвращает значение по умолчанию, если запрашиваемого ключа нет (вместо того чтобы выбрасывать исключение KeyError).При создании
defaultdict необходимо указывать не само значение по умолчанию, а фабрику для его создания.Это позволяет создавать словари с бесконечным числом вложенных уровней, что дает возможность писать что-то вроде
d[a][b][c]...[z].
>>> def infinite_dict():
... return defaultdict(infinite_dict)
...
>>> d = infinite_dict()
>>> d[1][2][3][4] = 10
>>> dict(d[1][2][3][5])
{}
Такое поведение называется “автовивификация” (от англ. autovivification) — термин пришёл из языка Perl.
👉@BookPython
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Некоторые модули Python компилируются непосредственно в сам интерпретатор. Они называются встроенными модулями (built-in), и их не следует путать со стандартной библиотекой. Чтобы получить полный список таких модулей, можно использовать
Обычно вам не важно, является ли модуль встроенным или нет; однако стоит иметь в виду, что
📲 Мы в MAX
👉@BookPython
sys.builtin_module_names. Примеры таких модулей — sys, gc, time и т. д.Обычно вам не важно, является ли модуль встроенным или нет; однако стоит иметь в виду, что
import сначала ищет модуль среди встроенных. Поэтому будет загружен встроенный модуль sys, даже если в текущей директории есть файл sys.py. С другой стороны, если, например, в текущей директории есть файл datetime.py, он действительно может быть загружен вместо стандартного модуля datetime.👉@BookPython
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3