Как разбить словарь, содержащий списки, на равные части по длине списков - PullRequest
1 голос
/ 04 ноября 2019

Допустим, у меня есть словарь, содержащий несколько списков разных размеров, как бы я разделил словарь на 4 словаря одинаковой длины в зависимости от длины списков. Есть ли простой способ сделать это?

dict = {"A":[1,2,3,4,5], "B":[1,2,3], "C":[1,2,3,4,5,6,7,8]}

Как бы я разделил это на 4 словаря одинаковой длины, чтобы я получил результат:

dict1 = {"A":[1,2,3,4]}
dict2 = {"A":[5], "B":[1,2,3]}
dict3 = {"C":[1,2,3,4]}
dict4 = {"C":[5,6,7,8]}

Редактировать: еслиего нельзя разделить равномерно, тогда один из словарей окажется немного длиннее остальных.

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Вот способ сделать это, используя генератор для получения последовательных пар ключ-значение:

data = {"A":[1,2,3,4,5], "B":[1,2,3], "C":[1,2,3,4,5,6,7,8]}


def key_value_gen(data):
    # will yield ('A', 1), ('A', 2), .... ('C', 8)
    for key, values in data.items():
        for value in values:
            yield key, value

out = []
size = 4

for index, (key, value) in enumerate(key_value_gen(data)):
    # if the index is a multiple of size, we add a new dict
    if index % size == 0:
        out.append({})
    out[-1].setdefault(key, []).append(value)

print(out)
# [{'A': [1, 2, 3, 4]}, {'A': [5], 'B': [1, 2, 3]}, {'C': [1, 2, 3, 4]}, {'C': [5, 6, 7, 8]}]
0 голосов
/ 04 ноября 2019

Другой способ с итеративным подходом:

def group_by_count(dic, size):
    output, temp, count = [], {}, 0
    for k, v in dic.items():
        for x in v:
          if count == size:
              output.append(temp)
              temp, count = {}, 0
          temp[k] = temp.get(k, []) + [x]
          count += 1
    if temp:
        output.append(temp)
    return output

d = {"A":[1,2,3,4,5], "B":[1,2,3], "C":[1,2,3,4,5,6,7,8]}
output = group_by_count(d, 4)
for dic in output:
  print(dic)

Вывод:

{'A': [1, 2, 3, 4]}
{'A': [5], 'B': [1, 2, 3]}
{'C': [1, 2, 3, 4]}
{'C': [5, 6, 7, 8]}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...