Как разбить подсписки на диктовку? - PullRequest
1 голос
/ 28 апреля 2020

Ну, ребята, я создал диктовку и разделил ее с помощью функции:

listOfDicts = [{k:v for k,v in dictionary.items() if k%10==i} for i in range(10)]

Из этого я получил 10 списков:

listOfDicts[0 a 9]
listOfDict[0]: {0: 0, 10: 5, 20: 10, 30: 15, 40: 20, 50: 25, 60: 30, 70: 35, 80: 40, 90: 45}

Но что, если я захочу разделите подсписки на равные размеры (в случае, если размер = 3) и добавьте в единый текст:

listOfDict[0]: {{0: 0, 10: 5, 20: 10}, {30: 15, 40: 20, 50: 25}, {60: 30, 70: 35, 80: 40}, {90: 45}}

1 Ответ

0 голосов
/ 28 апреля 2020

Есть несколько вариантов в зависимости от того, что вы ищете:

dictionary = {0: 123, 10: 345, 20: 678, 30: 123, 40: 345, 50: 678, 60: 123, 70: 345, 80: 678 ,90: 123 }

1) Фиксированное количество слотов в списке (т. Е. Всегда 10):

slotCount   = len(dictionary)//10
items       = sorted(dictionary.items())
listOfDict  = [ dict(items[i:i+ slotCount]) 
                for i in range(0,len(items),slotCount) ]
listOfDict += [ {} for _ in range(slotCount,len(items),-1) ] 

2) Фиксировано количество записей на слоты (переменное число слотов):

bucketSize  = 10
items       = sorted(dictionary.items())
listOfDict  = [ dict(items[i:i+bucketSize]) 
                for i in range(0,len(items),bucketSize) ]

3) Сбалансированное количество записей и слотов:

bucketSize  = int(len(dictionary)**0.5)
items       = sorted(dictionary.items())
listOfDict  = [ dict(items[i:i+bucketSize]) 
                for i in range(0,len(items),bucketSize) ]

4) Равномерно распределенные данные по 10 слотам в list:

slotCount   = 10
listOfDicts = [ {k:v for k,v in dictionary.items() 
                    if abs(hash(str(k))) % slotCount == i} 
                for i in range(slotCount) ]

Примечание: все эти методы позволят определить, к какому слоту принадлежит ключ после создания списка. Первые 3 подхода разбивают словарь в отсортированном порядке ключа, поэтому можно использовать алгоритм биссектриса поиска. Четвёртое просто использует функцию хеширования, которая напрямую возвращает номер слота ключа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...