Словарь, где значениями выступают подсписки по их сумме
У меня есть некий массив данных, который я забираю из экселевского файла и заворачиваю в список (1). Далее я пытаюсь сформировать словарь, где в качестве значений выступают подсписки, состоящие из первых элементов основного списка (1), сумма которых не больше 40. Ниже код:
def weeks_split(array):
new_h_list = cp.copy(array)
index = 1
sub_list = []
week_list = {}
while new_h_list:
sub_list.append(new_h_list.pop(0))
if sum(sub_list) >= 40:
print(sub_list)
week_list[index] = sub_list
index += 1
sub_list.clear()
return week_list
Словарь по итогу формируется, но все значения у ключей одинаковые. Причём видно, что подсписки формируются так, как мне нужно, но в словарь залетает что-то непонятное)
[16, 8, 6, 0, 4, 0, 8]
[3, 3, 4, 34]
[10, 0, 6, 4, 3, 3, 4, 4, 4, 0, 8]
[4, 4, 4, 8, 6, 4, 2, 2, 4, 4]
[3, 2, 2, 4, 4, 0, 16, 6, 2, 6]
[8, 0, 10, 4, 4, 4, 4, 4, 8]
[8, 8, 6, 10, 4, 2, 2]
[10, 4, 4, 0, 16, 6]
[8, 4, 4, 0, 12, 8, 4]
[0, 16, 8, 8, 0, 8]
[4, 0, 8, 4, 6, 4, 0, 6, 0, 16]
[4, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 6, 0, 16, 6]
{1: [6, 16], 2: [6, 16], 3: [6, 16], 4: [6, 16], 5: [6, 16], 6: [6, 16], 7: [6, 16], 8: [6, 16], 9: [6, 16], 10: [6, 16], 11: [6, 16], 12: [6, 16]}
Подскажите пожалуйста, где я косячу?
Ответы (2 шт):
У вас переменная sub_list является значением каждой записи в словаре и ссылается на одно и то же место в памяти... Попробуйте python style (1 2 3 и т.д.):
array = [
[16, 0, 0, 0, 0, 0, 8],
[3, 3, 4, 34],
[10, 0, 1, 0, 1, 0, 0, 0, 8],
[4, 1, 1, 1, 1, 1, 4],
[3, 2, 2, 4, 4, 0, 16, 6, 2, 6],
[8, 0, 0, 0, 0, 0, 8],
[8, 8, 6, 10, 4, 2, 2],
[10, 4, 4, 0, 16, 6],
[8, 4, 4, 0, 12, 8, 4],
[0, 16, 8, 8, 0, 8],
[4, 0, 0, 0, 0, 0, 16],
[4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 6]
]
"сформировать словарь, где в качестве значений выступают подсписки" можно представлением словаря (не знаю почему, но dict comprehension назван генератором словаря, хотя это разные вещи в python):
week_list = {i: el for i, el in enumerate(array, 1) if sum(el) >= 40}
в week_list будет словарь с порядковым номером списка в исходном array в ключах (от 1):
>>> week_list
{
2: [3, 3, 4, 34],
5: [3, 2, 2, 4, 4, 0, 16, 6, 2, 6],
7: [8, 8, 6, 10, 4, 2, 2],
8: [10, 4, 4, 0, 16, 6],
9: [8, 4, 4, 0, 12, 8, 4],
10: [0, 16, 8, 8, 0, 8]
}
или, если ключ должен быть порядковым номером в итоговом week_list, то так:
index = 0
week_list = dict()
for a in array:
if sum(a) >= 40:
week_list.update({index: a})
index += 1
тогда в week_list будет:
>>> week_list
{
0: [3, 3, 4, 34],
1: [3, 2, 2, 4, 4, 0, 16, 6, 2, 6],
2: [8, 8, 6, 10, 4, 2, 2],
3: [10, 4, 4, 0, 16, 6],
4: [8, 4, 4, 0, 12, 8, 4],
5: [0, 16, 8, 8, 0, 8]
}
sub_list.clear()
Никогда не используйте метод list.clear, если не знаете точно, зачем вы это делаете. Этот метод можно использовать только если у вас используется одна ссылка на этот список. Если же вы хотите именно сделать новый, отдельный список и получить на него ссылку (обычно это делается в каком-то цикле), то нужно это делать стандартным питоновским способом:
sub_list = []
Это будет уже новый список, не связанный со старым списком.