#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]