如何使用Python将字典转换为K个大小的字典?




如何使用Python将字典转换为K个大小的字典?

字典是Python中的键-值数据结构,其中键是唯一的,值可以重复或不重复。键和值可以是任何数据类型。在本文中,我们将看到如何使用Python将字典转换为K个大小的字典,这意味着我们将把一个字典分成K个较小的字典,其中K是任何正数,即K>0。

示例:

假设输入的字典是d = {‘a’: 1, ‘b’: 2, ‘c’: 3, ‘d’: 4, ‘e’: 5, ‘f’: 6, ‘g’: 7, ‘x’: 8, ‘y’: 9}



则相应的输出应该是{‘a’: 1, ‘b’: 2, ‘c’: 3},{‘d’: 4, ‘e’: 5, ‘f’: 6},{‘g’: 7, ‘x’: 8, ‘y’: 9}

输入的字典d的大小为9,因为有9个键-值对,我们只需将d分成大小为3的3个较小的字典。

方法1:朴素方法

朴素方法一般是解决任何给定问题陈述的最简单或最不复杂的方法,不一定被选择为解决方案。例如,当应用于字典转换时,这可能涉及迭代原始字典中的所有键,并使用基本的索引计算将它们均匀分散到大小为K的字典中。

示例:

def convert_dict_to_k_sized_dicts(dictionary, k):
    result = [{} for _ in range(k)]  # Initialize a list of empty dictionaries    
    keys = list(dictionary.keys())  # Get the keys of the original dictionary
    num_keys = len(keys)    
    for i in range(num_keys):
        key = keys[i]
        value = dictionary[key]    
          # Determine the index of the dictionary to store the key-value pair    
        index = i % k
        # Add the key-value pair to the respective dictionary          
        result[index][key] = value      
    return result
my_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7,'x':8,'y':9}
k = 3
result = convert_dict_to_k_sized_dicts(my_dict, k)
print(result)

输出

[{'a': 1, 'd': 4, 'g': 7}, {'b': 2, 'e': 5, 'x': 8}, {'c': 3, 'f': 6, 'y': 9}]

方法2:使用itertools.cycle

Python的itertools模块提供了一个函数itertools.cycle(),它可以创建一个迭代器,可以无限循环地遍历可迭代对象的元素。当调用该函数时,它会返回一个迭代器,该迭代器会以循环方式重复返回可迭代对象的元素,简单来说就是一旦到达可迭代对象的末尾,它会从头开始重新开始,因此允许我们在不手动实现循环逻辑的情况下迭代元素。

使用next()函数来获取迭代器的下一个元素。当将迭代器作为参数提供时,它会返回迭代器的下一个元素。每次调用next()函数时,迭代器都会向前移动,同时返回下一个元素。next()函数经常在循环中使用,以遍历迭代器的元素,直到处理完每一个元素为止。当迭代器中没有更多的元素时,调用next()函数会产生一个StopIteration异常,表示迭代结束。

综合起来,itertools.cycle()和next()可以用来创建循环迭代模式。

示例

import itertools

def convert_dict_to_k_sized_dicts(dictionary, k):
    result = [{} for _ in range(k)]    
    keys = list(dictionary.keys())
    num_keys = len(keys)    
    key_cycle = itertools.cycle(range(k))
    for i, key in enumerate(keys):
        value = dictionary[key]
        index = next(key_cycle)
        result[index][key] = value    
    return result
my_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'x': 8, 'y': 9}
k = 3
result = convert_dict_to_k_sized_dicts(my_dict, k)
print(result)

输出

[{'a': 1, 'd': 4, 'g': 7}, {'b': 2, 'e': 5, 'x': 8}, {'c': 3, 'f': 6, 'y': 9}]

方法3:使用字典推导和enumerate进行操作

字典推导提供了一种在Python中创建紧凑/可读字典的高效方法,而enumerate()提供了一种更简单的方法来遍历可迭代对象并跟踪它们的索引号和内容;返回一个迭代器,它产生索引/值对,可以在迭代过程中方便地访问两个元素。

例子

def convert_dict_to_k_sized_dicts(dictionary, k):
    result = [{} for _ in range(k)]    
    for i, (key, value) in enumerate(dictionary.items()):
        index = i % k
        result[index][key] = value    
    return result

my_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'x': 8, 'y': 9}
k = 3
result = convert_dict_to_k_sized_dicts(my_dict, k)
print(result)

输出结果

[{'a': 1, 'd': 4, 'g': 7}, {'b': 2, 'e': 5, 'x': 8}, {'c': 3, 'f': 6, 'y': 9}]

方法4:使用列表推导式和切片

通过定义一个表达式并迭代一个或多个可迭代对象,可以使用列表推导式来创建列表。在本例中,列表推导式有助于生成一个字典列表,其中每个字典都是使用字典推导式创建的,该字典推导式迭代一个由切片确定的键和值列表的子集,并在k间隔下选择元素。

例子

def convert_dict_to_k_sized_dicts(dictionary, k):
    keys = list(dictionary.keys())
    values = list(dictionary.values())
    return [{keys[i]: values[i] for i in range(start, len(keys), k)} for start in range(k)]

my_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'x': 8, 'y': 9}
k = 3
result = convert_dict_to_k_sized_dicts(my_dict, k)
print(result)

输出

[{'a': 1, 'd': 4, 'g': 7}, {'b': 2, 'e': 5, 'x': 8}, {'c': 3, 'f': 6, 'y': 9}]

方法5:使用numpy.array_split

可以使用数据处理模块Numpy的array_split()函数沿指定轴将数组分割成多个子数组。它的输入是一个数组和所需的等大小的分割数,输出是一个子数组的列表。由于我们将把字典分成k个相等的部分,所以这个函数在这种情况下非常有用,因为它消除了任何手动计算或索引的需要。

示例

import numpy as np

def convert_dict_to_k_sized_dicts(dictionary, k):
    keys = list(dictionary.keys())
    values = list(dictionary.values())
    result = []
    for group in np.array_split(range(len(keys)), k):
        sub_dict = {keys[i]: values[i] for i in group}
        result.append(sub_dict)
    return result

my_dict = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5, 'f': 6, 'g': 7, 'x': 8, 'y': 9}
k = 3
result = convert_dict_to_k_sized_dicts(my_dict, k)
print(result)

输出

[{'a': 1, 'b': 2, 'c': 3}, {'d': 4, 'e': 5, 'f': 6}, {'g': 7, 'x': 8, 'y': 9}]

方法6:使用zip和解压

您可以使用解压方法从可迭代对象中删除组件或将变量应用于序列。借助Python方法zip(),可以将多个可迭代对象逐个元素有效地组合成元组。当组合时,zip()和解压功能使得可以同时处理多个可迭代对象的相关项。

示例

def convert_dict_to_k_sized_dicts(dictionary, k):
    keys = list(dictionary.keys())
    values = list(dictionary.values())
    result = [dict(zip(keys[start::k], values[start::k])) for start in range(k)]
    return result

my_dict = {'abb': 1, 'xyz': 2, 'cat': 3, 'dog': 4, 'elephant': 5, 'frog': 6, 'garlic': 7, 'x': 8, 'y': 9}
k = 3
result = convert_dict_to_k_sized_dicts(my_dict, k)
print(result)

输出结果

[{'abb': 1, 'dog': 4, 'garlic': 7}, {'xyz': 2, 'elephant': 5, 'x': 8}, {'cat': 3, 'frog': 6, 'y': 9}]

结论

我们已经介绍了多种将字典转换为大小为k的字典的方法。这些方法包括:使用原始方法;使用 itertools.cycle() ;使用字典推导式; xenumerate() ;利用列表推导式和切片;使用 numpy.array_split() ;最后使用 zip() 和拆包。所有方法的时间复杂度都为O(n),其中n表示键值对的数量。



Python 精选笔记
使用Python和Pandas库构建股票价格预测模型如何在Python中解析XML并计算特定节点属性的实例?如何在Python中解析本地HTML文件?如何按多列对PySpark DataFrame进行排序?如何在Pygame中移动游戏角色?如何在Python中同时打开两个文件?如何使用Python移动文件夹及其子文件夹的列表?如何使用Python将多个文件夹合并成一个文件夹?如何使用Python将多个Excel文件合并成一个单一文件?如何使用Python Pandas按照共同的键合并多个TSV文件?如何使用PIL将透明的PNG图片与另一张图片合并?Python中嵌套函数是如何工作的?Python中的全局变量和局部变量?在Python函数中如何使用全局变量?如何从Python对象中获取源代码?如何在Python中返回一个函数?如何在Python中安装matplotlib?Python - 分割包含散乱字符的字符串Python - 记录列表XORPython – 向记录的末尾添加数据Python - 键值大于K的记录在Python中垂直打印列表Python - 列表中字符串平均长度Python列表中的交替循环Python程序实现混淆词游戏Python-记录联合Python程序计算列表中元组的重复项Python程序:将字符串的字符转换为相反的大小写Python - 打印给定年份列表中的闰年数量Python - 打印所有子列表中的共同元素Python - 删除嵌套列表中的所有元素如何在Python列表中检查空格?在Python中引发异常到另一个异常Python字符串中的范围复制Python程序计算包含列表的列表中列表的数量修改给定Python列表中的重复值Python - 检查元素是否在指定范围内出现从Python的元组列表中删除所有字符串如何使用Pygame添加颜色呼吸效果?如何在Bokeh中添加颜色条如何在Bokeh中添加颜色选择器?使用Python程序显示带有星边框的数字半菱形图案Python使用ipaddress模块确定给定的IPv4地址是否为保留地址使用ipaddress模块的Python程序来确定给定的IP地址是公网还是私网Python程序通过平方和连接给定数字的奇数位数来创建一个OTPPython程序创建以零为中心的列表Python程序计算字符串中的字符数Python程序将米转换为码,反之亦然Python程序:统计文本文件中的元音、行数和字符数Python程序计算文本文件中的单词数量Python程序,用于计算文本文件中空格的数量将字典的值转换为字符串的Python程序Python程序将浮点数转换为指数Python程序将整数转换为指数Python程序将整数转换为罗马数字将整数列表转换为字符串列表的Python程序Python程序将XML转换为字典Python程序:通过重复键对应的值次数将字典转换为列表将Dict of list转换为CSV的Python程序使用正则表达式统计Python程序中大写字母、小写字母、特殊字符和数字值的个数Python元组的并集Python - 嵌套和混合列表中的类型转换Python - 将列表转换为单值列表的元组如何在Python中打印上标和下标?如何在Python中打印多个参数?如何在Plotly-Python中将图例定位在图表内部?如何使用Pandas绘制时序图表?如何使用SciPy在Python中绘制Ricker曲线?如何在Python列表中删除True值?如何使用Python将字典的值转换为绝对值?如何使用Python将字典转换为K个大小的字典?如何使用Python将浮点数舍入到2位小数?如何在Python中将Excel转换为CSV如何在Python中对元组进行索引和切片?如何在Python中判断一个对象是否有属性?在Python中创建实例对象如何使用Python获取城市的经纬度?如何在Python中获取整数输入?如何交换给定 NumPy 数组的列?如何使用NumPy抑制对小数的科学计数法使用?如何使用Python将XML数据存储到MySQL数据库中?如何在Pandas DataFrame中减去两列?如何在Pandas DataFrame中标准化数据?如何堆叠多个Pandas DataFrames?如何使用scikit-learn的train_test_split()函数拆分数据集如何在Python中分割数据以进行训练和测试,而不使用Sklearn在Python set中找到最大值和最小值Python程序:找到长方体的体积、表面积和空间对角线如何在Python程序中获取字符串的K个可能切片如何使用Altair在Python中制作密度图?生成一次性密码(OTP)的Python程序Python程序:找出数组中可被给定数整除的元素的XOR寻找巨大最大公约数(Jumbo GCD)子数组的Python程序如何在OpenCV Python中查找图像轮廓的边界矩形?如何在Python脚本所在的目录中打开文件?如何在Anaconda中安装Python包?如何在OpenCV Python中旋转图像?如何给定完整路径导入Python模块?如何在Python中从另一个函数调用变量?使用Python的Matplotlib在X轴上绘制日期如何在Python中不使用math模块进行平方根运算?如何在Python Tkinter中给Frame添加边框?如何从Python函数返回一个字典?Python程序获取元组中的第一个和最后一个元素如何求一个Python字典的值的总和?Python Pandas - 查找列的最大值并返回其对应的行值机器人流程自动化 - 简介机器学习中的逻辑回归损失函数如何从Python日期中减去一天?将物联网和机器学习相结合,使我们的未来更智能机器学习中的Boosting | Boosting和AdaBoost如何在Python中将时间戳字符串转换为datetime对象?如何在Python中将变量名转换为字符串?什么是Python中的.pyc文件?Python - 检查列表中的所有元素是否相同如何在Python Plotly中设置Y轴的范围?如何将Python日期转换为Unix时间戳?Python中的Turtle绘图编程如何在Python中的给定位置插入一个对象到列表中?如何在Python中进行日期验证?如何使用Python将两个图并排显示?在Python中的方法和函数之间的区别Python中的PYTHONPATH环境变量是什么?如何对Python日期字符串列表进行排序?在Python的Pandas中向现有的DataFrame中添加新列如何将Python元组转换为字典?Python - 使用Pandas读取没有标题的csv文件?如何使用OpenCV Python在图像中检测矩形和正方形?如何使用OpenCV在Python中改变图像的对比度和亮度?如何在Python中将日期时间转换为UTC时间戳?如何列出Python模块中的所有函数?Python程序查找字符串中的所有重复字符使用Python进行文件搜索如何在Python Tkinter中更改按钮大小?如何在Python shell中了解/更改当前目录?如何在Python中检查一个字符是否为大写字母?如何在OpenCV Python中对图像进行归一化?在Python中更新列表如何在Python中生成不重复的随机数?Python中元素的频率列表在Python中for循环和while循环的区别