如何使用 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)] # 初始化一个空字典列表 keys = list(dictionary.keys()) # 获取原始字典的键 num_keys = len(keys) for i in range(num_keys): key = keys[i] value = dictionary[key] # 确定存储键值对的字典的索引 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}]
方法 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:使用字典推导和枚举
字典推导提供了一种在 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 和 unpacking
您可以使用 unpacking 方法从可迭代对象中删除组件或将变量应用于序列。借助 Python 方法 zip(),可以高效地将多个可迭代对象逐个元素组合成元组。组合使用 zip() 和 unpacking 函数可以一次处理多个可迭代对象中的相关项。
示例
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}]
结论
我们介绍了在 Python 中将字典转换为 k 大小字典的多种方法。这些方法包括简单方法;使用 itertools.cycle();使用字典推导;xenumerate();利用列表推导和切片;使用 numpy.array_split() 以及最后使用 zip() 进行解包。所有方法的时间复杂度均为 O(n),其中 n 表示键值对的数量。