Разделите список на неравные куски, указанные в словаре

#python

Вопрос:

Итак, вот моя проблема: у меня есть список одиннадцатого размера вместе со словарем, который говорит нам, как этот список следует разделить. Итак, здесь первый индекс должен содержать подсписок [14, 10, 2, 4], второй индекс [12, 8, 8, 5] и так далее.

 l = [14, 10, 2, 4, 12, 8, 8, 5, 9, 2, 7]

dico = dict()
dico[0] = 4
dico[1] = 4
dico[2] = 3
dico
>>> {0: 4, 1: 4, 2: 3}
 

В конечном итоге ожидаемое поведение будет следующим

 {0:[14, 10, 2, 4], 1:[12, 8, 8, 5], 2:[9, 2, 7]}
 

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

Комментарии:

1. Не могли бы вы, пожалуйста, показать нам, что вы пытались решить эту проблему?

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

3. @tard Или не используйте версию Python каменного века.

Ответ №1:

Учитывая ваши примерные данные и достаточно молодую версию Python (которая поддерживает порядок вставки для повторения диктовок), вы можете просто сделать:

 i = iter(l)

{k: [next(i) for _ in range(v)] for k, v in dico.items()}
# {0: [14, 10, 2, 4], 1: [12, 8, 8, 5], 2: [9, 2, 7]}
 

Ответ №2:

 new_d = {}
for key in dico:
    new_d[key] = l[:dico[key]]
    l[:dico[key]] = []

print(new_d)
{0: [14, 10, 2, 4], 1: [12, 8, 8, 5], 2: [9, 2, 7]}

 

Ответ №3:

Я предложу этот вариант:

 l = [14, 10, 2, 4, 12, 8, 8, 5, 9, 2, 7]
l2 = l.copy()
dico = {0: 4, 1: 4, 2: 3}

for key, val in dico.items():
    for j in range(dico[key]):
        if j == 0:
            dico[key] = []
        dico[key].append(l2.pop(0))

print(dico)
print(l)
 

Выход:

 {0: [14, 10, 2, 4], 1: [12, 8, 8, 5], 2: [9, 2, 7]}
[14, 10, 2, 4, 12, 8, 8, 5, 9, 2, 7]