По умолчанию сортировка разных типов в Python 3 невозможна, но параметр key позволяет задать нормализацию данных. Ключ — кортеж (isinstance(x, str), int(x)): сначала сортируем по флагу «x — строка?» (False < True, значит числа идут раньше строк), затем по числовому значению int(x).
Разбор по шагам:
🔘Для 1 ключ (False, 1), для 2 — (False, 2). Для '3' — (True, 3), для '10' — (True, 10), для '20' — (True, 20).
🔘Сначала все элементы с False: 1, 2; затем True: '3', '10', '20'. Внутри групп сравнение по второму элементу ключа, то есть по числу после приведения.
🔘Поэтому результат — [1, 2, '3', '10', '20'].
Подводные камни:
🔘Без key будет TypeError, потому что числа и строки несравнимы.
🔘Если в данных встретится строка, не приводимая к int (например, 'x'), key упадёт с ValueError — для устойчивости можно использовать try/except в ключе или заранее фильтровать данные.
Вариант устойчивого ключа:
𝚍𝚎𝚏 𝚔(𝚡):
𝚝𝚛𝚢:
𝚛𝚎𝚝𝚞𝚛𝚗 (𝚒𝚜𝚒𝚗𝚜𝚝𝚊𝚗𝚌𝚎(𝚡, 𝚜𝚝𝚛), 𝚒𝚗𝚝(𝚡))
𝚎𝚡𝚌𝚎𝚙𝚝 𝚅𝚊𝚕𝚞𝚎𝙴𝚛𝚛𝚘𝚛:
𝚛𝚎𝚝𝚞𝚛𝚗 (𝚒𝚜𝚒𝚗𝚜𝚝𝚊𝚗𝚌𝚎(𝚡, 𝚜𝚝𝚛), 𝚏𝚕𝚘𝚊𝚝('𝚒𝚗𝚏'))
Post #4452
789
- 🔥 2