Python 3.6 Создание сопоставления из массива с размерами - PullRequest
1 голос
/ 19 марта 2020

Задача

У меня есть массив с размерами

sizes = [5, 3, 1, 2]

и в зависимости от размеров я хочу создать следующий массив

mapping = [0, 0, 0, 0, 0, 1, 1, 1, 2, 3, 3]

Решение

Моя первая попытка

mapping = []
ctr = 0
for i in range(len(sizes)):
    for j in range(sizes[i]):
        mapping.append(i)
        ctr += 1

Укороченная версия

mapping = [[i for _ in range(sizes[i])] for i in range(len(sizes))]
mapping = list(itertools.chain(*mapping))

Вопрос

Однострочная версия?

Можно ли сделать это всего за одну строку с аккуратным кодом?

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

Использование enumerate

Пример:

sizes = [5, 3, 1, 2]
result = [i for i, v in enumerate(sizes) for _ in range(v)]
print(result)

Выход:

[0, 0, 0, 0, 0, 1, 1, 1, 2, 3, 3]
1 голос
/ 19 марта 2020

Другой подход заключается в умножении индексов на подсписки [[0, 0, 0, 0, 0], [1, 1, 1], [2], [3, 3]], а затем сведении результата с помощью itertoo.chain.from_iterable:

>>> from itertools import chain
>>> sizes = [5, 3, 1, 2]
>>> list(chain.from_iterable([i] * x for i, x in enumerate(sizes)))
[0, 0, 0, 0, 0, 1, 1, 1, 2, 3, 3]
...