60th
В одном из телеграм-каналов однажды наткнулся на рубрику в нескольких постах, где в таких маленьких зарисовках рассказывали компактные решения, фичи и тд.
Вот архивчик всего того что я нашёл:
list(Path('.').rglob('*.py'))-> Рекурсивный поиск всех файлов с расширением.pyв текущей директории и поддиректориях.timeit(lambda: your_func(), number=1000)-> Быстрый замер скорости выполнения кода (запускаетyour_func1000 раз и возвращает общее время).[m for m in dir(obj) if not m.startswith('_')]-> Получение списка всех публичных методов и атрибутов объекта.df.dropna()-> Удаление всех строк с пропущенными значениями (NaN) из DataFrame в pandas.list(ThreadPoolExecutor().map(func, iterable))-> Простое распараллеливание: запуск функцииfuncдля каждого элементаiterableв отдельном потоке.dict(Counter(my_list))-> Подсчет количества каждого уникального элемента в списке. Возвращает словарь{элемент: количество}.[x for x, c in Counter(lst).items() if c > 1]-> Поиск всех дубликатов в списке.list(filter(None, data))-> Фильтрация списка, удаляющая все "ложные" значения (None,False,0,"",[]).try: foo() except Exception as e: logging.exception(e)-> Конструкция для перехвата любого исключения из функцииfoo()и его логирования с полной трассировкой.pd.DataFrame(list_of_dicts)-> Превращение списка словарей в таблицу (DataFrame) pandas.{v: k for k, v in d.items() if list(d.values()).count(v) == 1}-> Инвертирование словаря (ключи становятся значениями и наоборот), но только для уникальных значений.start = time(); result = fn(); print(f'{time() - start:.2f}s')-> Простейший способ замерить время выполнения одной операции.random.sample(big_list, k=100)-> Взять 100 случайных, уникальных элементов из большого списка без его изменения.max(data, key=lambda x: x.score)-> Найти в списке объектов тот, у которого атрибутscoreмаксимален.textwrap.dedent(multiline_string)-> Удаление лишних общих отступов слева у многострочной строки.[func() for _ in range(5) if not success()][-1]-> Хитрый способ повторить вызовfuncдо 5 раз, покаsuccess()не вернётTrue.json.loads(Path('file.json').read_text())-> Чтение JSON-файла и его преобразование в объект Python (словарь или список).v /= np.linalg.norm(v)-> Нормализация NumPy-вектора (приведение его длины к 1) на месте.'\n'.join(f'{k}={v}' for k, v in sorted(os.environ.items()))-> Вывод всех переменных окружения в отсортированном по имени виде.urlencode(params)-> Преобразование словаряparamsв строку запроса для URL (например,key=value&key2=value2).Path('file.txt').read_text().splitlines()-> Чтение текстового файла целиком в список строк, автоматически убирая символы переноса\n.hashlib.sha256(b"your text").hexdigest()-> Получение SHA256-хеша от строки в шестнадцатеричном формате.','.join(map(str, numbers))-> Преобразование списка чисел в одну строку, где числа разделены запятой.raise SystemExit("Done")-> Корректный способ остановить выполнение скрипта с сообщением (не считается ошибкой).sys.getsizeof(obj)-> Получение размера объекта в байтах в памяти.[i for sub in nested for i in sub]-> "Распрямление" списка списков в один плоский список.~mask-> Инвертирование булевой маски в NumPy (TrueстановитсяFalseи наоборот).seen = set(); [x for x in lst if not (x in seen or seen.add(x))]-> Удаление дубликатов из списка с сохранением исходного порядка элементов.result = func(**params)-> Распаковка словаряparamsв именованные аргументы для функцииfunc.dict(Counter(lst).most_common(5))-> Получение 5 самых часто встречающихся элементов в списке и их количества.s[:n] + '…' if len(s) > n else s-> Обрезка строки доnсимволов с добавлением многоточия, если она была длиннее.[random.randint(0, 1) for _ in range(n)]-> Создание списка изnслучайных нулей и единиц.date.today().isoformat()-> Получение сегодняшней даты в стандартном форматеYYYY-MM-DD.os.path.getsize(path) / 1024**2-> Получение размера файла в мегабайтах.dict(random.sample(d.items(), len(d)))-> Перемешивание словаря (создание нового словаря со случайным порядком ключей).with contextlib.redirect_stdout(io.StringIO()): exec('code')-> Выполнение куска кода в виде строки, подавляя любой его вывод в консоль.[lst[i:i+n] for i in range(0, len(lst), n)]-> Разделение списка на "чанки" — списки одинакового размера поnэлементов.socket.create_connection((host, port), timeout=2)-> Проверка, доступен ли TCP-порт на указанном хосте (быстрая альтернативаping).s.replace('from', 'to', 1)-> Замена только первого вхождения подстроки в строке.all(isinstance(x, (int, float)) for x in lst)-> Проверка, что все элементы в списке являются числами (intилиfloat).groups = defaultdict(list); [groups[k].append(v) for k, v in data]-> Группировка списка кортежей(ключ, значение)в словарь{ключ: [значения]}.copy = pickle.loads(pickle.dumps(obj, -1))-> Быстрое и глубокое копирование объекта, работающее для большинства стандартных типов.r = requests.post(url, json=payload)-> Отправка POST-запроса с автоматической сериализацией словаряpayloadв JSON-тело.is_symlink = Path(p).is_symlink()-> Проверка, является ли путьpсимволической ссылкой, а не реальным файлом или папкой.merged = {**d1, **d2, **d3}-> Быстрое объединение нескольких словарей. Значения из последующих словарей перезаписывают значения из предыдущих при совпадении ключей.is_sorted = all(a <= b for a, b in zip(lst, lst[1:]))-> Эффективная проверка, отсортирован ли список по возрастанию, без создания копий списка.matches = re.findall(r'\d+', text)-> Поиск всех непересекающихся вхождений по регулярному выражению в строке и возврат их в виде списка строк.domain = urlparse(url).netloc-> Простое и надёжное извлечение домена (например,www.example.com) из полного URL.nums = list(map(int, str_list))-> Компактное преобразование списка строк в список целых чисел.rows = list(csv.DictReader(open('file.csv')))-> Чтение CSV-файла в виде списка словарей, где ключами являются заголовки столбцов.bits = f'{num:08b}'-> Преобразование целого числа в его двоичное представление в виде строки, дополненной нулями до 8 символов.json.dump(obj, open('data.json', 'w'), indent=2)-> Сохранение объекта Python (словаря, списка) в JSON-файл с красивым форматированием (отступ в 2 пробела).lines = [l for l in lines if l.strip()]-> Фильтрация списка строк, удаляющая пустые строки и строки, состоящие только из пробельных символов.params = dict(parse_qsl('a=1&b=2'))-> Преобразование строки URL-запроса (query string) в словарь.uniq = [s for s in seq if not (s in seen or seen.add(s))]-> Эффективное удаление дубликатов из последовательности с сохранением исходного порядка (требуетseen = set()).idx = max(range(len(lst)), key=lst.__getitem__)-> Нахождение индекса максимального элемента в списке без дополнительного поиска.is_nested = all(isinstance(i, list) for i in lst)-> Проверка, является ли список "вложенным", т.е. все его элементы — это списки.clean = re.sub(r'\W+', '', text)-> Удаление из строки всех символов, не являющихся буквами, цифрами или знаком подчёркивания.signal.alarm(2); try: ... except: ...-> Ограничение времени выполнения блока кода (только для Unix-подобных систем).fields = [f.name for f in dataclasses.fields(MyClass)]-> Получение списка имён всех полей для заданного дата-класса.