How to split dictionary into equal chunks

Question:

I want to split this dictionary into equal chunks.

{0: 'media', 1: 'alta', 2: 'media', 3: 'media', 4: 'alta', 5: 'alta', 6: 'baja', 7: 'media', 8: 'media', 9: 'media', 10: 'media', 11: 'media'}

Output

{0: 'media', 1: 'alta', 2: 'media'}
{0: 'media', 1: 'alta', 2: 'alta'}
{0: 'baja', 1: 'media', 2: 'media'}
{0: 'media', 1: 'media', 2: 'media'}

Do you have any ideas without using external modules (numpy and etc.)?

Asked By: Fabrizzio Yepez

||

Answers:

If you’re looking to create a list of dictionaries, then your best bet would probably lie in for loops. The following code outputs what you’re looking for.

d = {0: 'media', 1: 'alta', 2: 'media', 3: 'media', 4: 'alta', 5: 'alta', 6: 'baja', 7: 'media', 8: 'media', 9: 'media', 10: 'media', 11: 'media'}

list_o_dict = []

# Go through the dictionary, but skip ahead by 3 each time
for i in range(0, len(d), 3):

    # Append a new dictionary to the list
    list_o_dict.append({0 : d[i], 1 : d[i + 1], 2 : d[i + 2]})


# This can be omitted, but just prints the list out
for i in list_o_dict:
    print(i)
Answered By: Hhadley

You can create a generator. Assuming you want the new dictionary keys to start from 0 each time, here is what you can do:

dict_input = {0: 'media', 1: 'alta', 2: 'media', 3: 'media', 4: 'alta', 5: 'alta', 6: 'baja', 7: 'media', 8: 'media', 9: 'media', 10: 'media', 11: 'media'}

# value_count is the dictionary's item limit
def split_dict(dict_obj, value_count):
    new_dict = {}
    number = 0
    for key, value in dict_obj.items():
        new_dict[number] = value
        number += 1
        if value_count == number:
            yield new_dict
            new_dict = {} # the dictionary resets after the dictionary is full
            number = 0 # if you want the index to start from zero in the next dictionary

running this function will return a generator which you can iterate to get the results.

split_dict(dict_input, 2)
for result in split_dict(dict_input, 2):
    print(result)

This should give you that output

{0: 'media', 1: 'alta', 2: 'media'}
{0: 'media', 1: 'alta', 2: 'alta'}
{0: 'baja', 1: 'media', 2: 'media'}
{0: 'media', 1: 'media', 2: 'media'}
Answered By: CemreY

Code

from itertools import islice

def split(d: dict[int, str], chunks: int) -> list[dict[int, str]]:
      chunk_len = len(d) // (chunks + 1)
      chunks_list = []
      for i in range(chunk_len):
          c = chunk_len * i
          chunks_list.append(dict())
          for k, v in islice(d.items(), c, c+chunk_len):
              chunks_list[i].update({k: v})
      return chunks_list

Then call

d = {0: 'media', 1: 'alta', 2: 'media', 3: 'media', 4: 'alta', 5: 'alta', 6: 'baja', 7: 'media', 8: 'media', 9: 'media', 10: 'media', 11: 'media'}

ss = split(d, 3)

Output

[{0: 'media', 1: 'alta', 2: 'media'},
{3: 'media', 4: 'alta', 5: 'alta'},
{6: 'baja', 7: 'media', 8: 'media'}]
Answered By: Hazem Elmahy
Categories: questions Tags:
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.