Python 3.15+Списки (list)конструкция
Распаковка * и ** в comprehension
comprehension
[*xs for xs in lists] склеивает вложенные коллекции в одну, {**d for d in dicts} — сливает словари. Замена двойного цикла и itertools.chain.
Синтаксис
[*it for it in iterables]
{*s for s in sets}
{**d for d in dicts}
(*it for it in iterables)
Звёздочка в начале выражения comprehension означает «выложить все элементы», как в [*a, *b]: [*row for row in matrix] равно [x for row in matrix for x in row], но читается без второго for. Работает в списках, множествах, генераторных выражениях и с ** в словарях; при слиянии словарей одинаковые ключи перезаписываются последним значением, как в {**a, **b}. Распаковывается только один уровень: [*xs for xs in [[1, [2]]]] даёт [1, [2]]. До 3.15 такая запись — SyntaxError, поэтому в коде для старых версий оставляют двойной цикл или itertools.chain.from_iterable.
Примеры
lists = [[1, 2], [3, 4], [5]]
print([*xs for xs in lists]) # → [1, 2, 3, 4, 5]
print({*s for s in [{1, 2}, {2, 3}]}) # → {1, 2, 3}
dicts = [{'a': 1}, {'b': 2}, {'a': 3}]
print({**d for d in dicts}) # → {'a': 3, 'b': 2} — последний ключ побеждает
См. также
Частые ошибки
Открыть в полном глоссарииdocs.python.orgСообщить о неточности