Python 中将列表转换为嵌套字典


列表由元素的有序序列定义,而嵌套字典定义字典包含另一个字典。当我们想要在大型字典中存储大量数据时,需要嵌套字典。在 Python 中,我们有一些内置函数,如 reduce() 和 zip(),可以将列表转换为嵌套字典。例如,字典数据传达数据结构内容,更容易理解。

语法

以下语法在示例中使用:

reduce()

Python 中的这个内置函数遵循 functools 模块来对列表执行特定操作。

zip()

zip() 是 Python 中的一个内置函数,它接受任何类型的参数 - 列表、元组、字典、集合等。

使用 for 循环

该程序使用 for 循环迭代输入列表和集合,以将列表转换为嵌套字典。

示例

在下面的示例中,我们首先创建列表并将其存储在变量 my_list 中。根据问题陈述,现在我们将创建一个空字典并将其存储在变量 p_list 中,并且相同的变量再次存储在变量 emp_dict 中,表示嵌套结构。然后使用 for 循环迭代 my_list 中的每个项目。继续在变量 p_list[item] 中创建新字典,然后将此变量交换到名为 p_list 的变量,这将描绘 Python 中的嵌套字典。最后,我们借助名为 emp_dict 的变量打印结果。

my_list = ['a', 'b', 'c']
# Nesting structure
emp_dict = p_list = {}
for item in my_list:
   p_list[item] = {}
   p_list = p_list[item]
print(emp_dict)

输出

{'a': {'b': {'c': {}}}}

使用 Functools 模块

需要在系统中安装以下命令:

pip install functools

该程序使用 functools 库,该库具有高级别的内置函数(如 reduce())来解决 Python 中将列表转换为嵌套字典的问题。

示例

在下面的示例中,首先导入名为 functools 的包,它将提供内置方法库()。然后创建列表并将其存储在变量 P 中。接下来,初始化变量 Q,该变量存储 reduce() 函数的值,该函数接受两个参数:

  • reduce(lambda x, y: {y:x}, Q[::-1]) for Q in P: reduce 函数从左到右迭代列表中的单个值。然后 lambda 函数采用两个参数 x 和 y,并返回一个字典,其中 y 为键,x 为值。'Q[::-1]) for Q in P' 描绘了嵌套字典结构,其中反转列表的每个结构元素都成为字典中的一个键。

最后,我们借助 Q 打印结果。

# The method name reduce() from functools module()
from functools import reduce
P = [['P', 'Q', 'R'], ['M', 'N', 'O']]
Q = [reduce(lambda x, y: {y:x}, Q[::-1]) for Q in P]
print(Q)

输出

[{'P': {'Q': 'R'}}, {'M': {'N': 'O'}}]

使用字典推导式

该程序使用 for 循环进行迭代,并且使用 zip 将创建 Python 中列表的字典转换。

示例

在下面的示例中,我们将首先在各自的变量中创建三个列表 - t1、t2 和 t3。然后借助键值对(即 a、b、c)创建字典的结构,这将表示使用 for 循环和内置方法 zip() 相对于变量 t1、t2 和 t3 的嵌套字典的形成。此过程称为字典推导式,并将其存储在变量 result 中。最后,我们借助变量 result 打印输出。

t1 = ['Letter', 'Word', 'Number']
t2 = ['A', 'Box', 'Integer']
t3 = [1, 3, 41905]
# create the nested dictionary by using dictionary comprehension
result = {a: {b: c} for (a, b, c) in zip(t1, t2, t3)}
print("The nesting dictionary: ", result)

输出

The nesting dictionary:  {'Letter': {'A': 1}, 'Word': {'Box': 3}, 'Number': {'Integer': 41905}}

使用递归

该程序使用任意深度来处理将列表转换为嵌套字典的问题。任意深度与字典推导式的行为类似。这里它将使用递归技术,称为函数自身调用函数。

示例

在下面的示例中,程序以递归 Python 开头,它接受两个参数 - lst(设置列表)和 d(将默认值设置为 0)。然后它将使用 if 语句检查整数 d 是否小于列表长度(即 len(lst)),如果发现小于,则返回空字典。接下来,该函数通过使用 字典推导式if 语句for 循环返回嵌套字典的结果。然后创建列表并将其存储在变量 my_lst 中。现在调用名为 my_dict 的函数,该函数将变量 my_lst 作为参数传递并存储在变量 result 中。最后,借助变量 result 打印输出。

def my_dict(lst, d=0):
   # if-statement to check condition and return of nested dictionary
   if d > len(lst):
      return {}
   return {a[d]: my_dict([x for x in lst if x[d] == a[d]], d+1) for a in lst}

my_lst = [['a', 'b', 'c'], ['d', 'e', 'f']]
result = my_dict(my_lst)
print("List to Nested Dictionary:\n", result)

输出

List to Nested Dictionary:
 {'a': {'b': {}}, 'd': {'e': {}}}

结论

我们探讨了四种不同的方法来解决基于将列表转换为 Python 中的嵌套字典的问题陈述。最后一个示例与所有其他示例略有不同,因为它使用任意深度方法显示列表和嵌套字典的输出,而前三个输出仅显示嵌套字典。列表和字典是 Python 中已知的 数据类型。

更新于: 2023年7月17日

599 次浏览

启动你的 职业生涯

通过完成课程获得认证

开始学习
广告