Найти в Дзене
Алексей Семенов

Как объединить несколько списков в Python

Очень быстро обрабатывая данные, вы попадете в ситуацию, когда вам придется работать с несколькими списками. Простой подход Давайте попробуем подойти к написанию как к доске Kanban, на которой у нас есть 3 столбца (to do, in progress и done). В качестве задачи попробуем собрать список всех записей независимо от статуса и построить из него плоский список. to_do = ["Словари в Python"]
in_progress = ["collections.Counter в Python", "itertools.chain в Python"]
done = ["Калькулятор в Python", "Ошибки с get в dict"]
# Добавление
tasks = to_do + in_progress + done
print(tasks) # ['Словари в Python', 'collections.Counter в Python', 'itertools.chain в Python', 'Калькулятор в Python', 'Ошибки с get в dict']
# extend
tasks = []
tasks.extend(to_do)
tasks.extend(in_progress)
tasks.extend(done)
print(tasks) # ['Словари в Python', 'collections.Counter в Python', 'itertools.chain в Python', 'Калькулятор в Python', 'Ошибки с get в dict'] Вышеупомянутые решения относительно просты, потому что у
Оглавление

Очень быстро обрабатывая данные, вы попадете в ситуацию, когда вам придется работать с несколькими списками.

Простой подход

Давайте попробуем подойти к написанию как к доске Kanban, на которой у нас есть 3 столбца (to do, in progress и done).

В качестве задачи попробуем собрать список всех записей независимо от статуса и построить из него плоский список.

to_do = ["Словари в Python"]
in_progress = ["collections.Counter в Python", "itertools.chain в Python"]
done = ["Калькулятор в Python", "Ошибки с get в dict"]

# Добавление
tasks = to_do + in_progress + done
print(tasks)
# ['Словари в Python', 'collections.Counter в Python', 'itertools.chain в Python', 'Калькулятор в Python', 'Ошибки с get в dict']

# extend
tasks = []
tasks.extend(to_do)
tasks.extend(in_progress)
tasks.extend(done)
print(tasks)
# ['Словари в Python', 'collections.Counter в Python', 'itertools.chain в Python', 'Калькулятор в Python', 'Ошибки с get в dict']

Вышеупомянутые решения относительно просты, потому что у нас есть предопределенные списки, которые мы должны добавить.

Проблема возникает, когда мы не знаем, сколько списков нам нужно объединить.

Например, давайте попробуем построить таблицу умножения, а затем составить из нее список .

Создаем таблицу умножения.

table = lambda size: [[col*row for col in range(1, size)] for row in range(1, size)]
table(5)
# [[1, 2, 3, 4], [2, 4, 6, 8], [3, 6, 9, 12], [4, 8, 12, 16]]

Теперь подключим ее с помощью расширения

flat_list = []
for row in table(5):
flat_list.extend(row)

print(flat_list)
# [1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12, 4, 8, 12, 16]

Chain в itertools

Решение выглядит неплохо.

Но мы можем сделать это более аккуратно, используя встроенную библиотеку itertools и функцию chain .

flat_list = itertools.chain(*table(5))
print(list(flat_list))
# [1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12, 4, 8, 12, 16]

Как видите, достаточно было распаковать список, и вся магия происходит сама собой.

Поскольку chain возвращает generator, мне пришлось выгрузить результат в список.

chain.from_iterable

Если распаковка списка показалась немного сложной, поверьте, вы не одиноки;).

Но для этого есть решение, так как есть возможность сделать это проще.

flat_list = itertools.chain.from_iterable(table(5))
print(list(flat_list))
# [1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12, 4, 8, 12, 16]

Chain и известные списки

Ничего не мешает использовать chain и для уже определенных списков.

tasks = itertools.chain(to_do, in_progress, done)
print(list(tasks))
# 'Словари в Python', 'collections.Counter в Python', 'itertools.chain в Python', 'Калькулятор в Python', 'Ошибки с get в dict']

Резюме

В этом коротком посте я хотел показать вам возможности chain из библиотеки itertools.

Если статья оказалась вам полезной - ставьте лайк :-)

Подписывайтесь на статьи https://zen.yandex.ru/id/5f56875a664c2c1f0b8dc68a