通过压缩键来展平嵌套字典的 4 种方法

扁平化嵌套字典的一种可能方法是压缩其键。嵌套字典中可以包含其他几个嵌套字典。

虽然嵌套字典可以帮助我们有效地存储分层数据,但我们无法解释和理解其原始形式的嵌套字典。

我们需要以可理解的格式打印它或将其压平。在展平嵌套字典时,我们可以压缩字典的键,用下划线或您喜欢的任何其他分隔符分隔。这样做将产生一本人类可读和可理解的词典。

在本教程中,我们将学习展平嵌套字典的所有可能方法。

在此之前,请访问这篇文章以了解有关词典的更多信息。

什么是嵌套字典?

嵌套字典也是可以在其中包含多个其他字典的字典。可以使用 for 循环甚至手动创建嵌套字典。

阅读本文以了解如何使用 for 循环创建嵌套字典。

让我们看一个嵌套字典的简单示例。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
nesteddict={'a': {
        'b': 1,
        'c': {
            'd': 2,
            'e': 3
        }
    },
    'f': 4
}
print("The nested dictionary is:")
print(nesteddict)
ks=nesteddict.keys()
print("The keys of the nested dictionary are:\n",ks)
vs=nesteddict.values()
print("The values of the nested dictionary are:\n",vs)

在上面的代码中,我们创建了一个名为 的变量nesteddict来存储嵌套字典。嵌套字典包含五个键 – a、b、c、d、e 以及与它们关联的一些相应值。但如果您注意到,键 b、c、d 和 e 被括在另一个键的大括号内,以便它们将被视为该键的值。keys()为了更好地理解这个概念,我们使用和函数分别打印字典的键和值values()

嵌套字典

我们可以观察到外部键 – a 和 f 作为键返回,而花括号内的 b、c、d 和 e 则被视为值。

由于这个例子是一个简单的嵌套字典,所以我们理解它不会有任何问题。但对于内部包含复杂字典的字典来说,情况就不同了。我们有一种方法可以以漂亮的方式打印嵌套字典。

阅读这篇文章以了解如何打印嵌套字典。

如何展平嵌套字典?

我们将使用之前看到的示例,并通过压缩其键来压平它。

使用用户定义的函数展平嵌套字典

我们将创建一个用户定义的函数来压缩键并展平嵌套字典。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 号
18
nesteddict = {
    'a': {
        'b': 1,
        'c': {
            'd': 2,
            'e': 3}},
    'f': 4}
def flattendict(d, parentkey='', sep='_'):
    items = []
    for k, v in d.items():
        newkey = parentkey + sep + k if parentkey else k
        if isinstance(v, dict):
            items.extend(flatten_dict(v, newkey, sep=sep).items())
        else:
            items.append((newkey, v))
    return dict(items)
flattened_dict = flattendict(nesteddict)
print("The flattened dictionary is:\n",flattened_dict)

在第一行中,我们创建一个嵌套字典,存储在名为nesteddict的变量中。

接下来,我们使用 def 关键字创建一个函数。这需要一个迭代器变量 d,并且父键在遍历每个级别时在嵌套字典上保留一个选项卡。我们这里使用的分隔符是下划线,它将嵌套键与下划线分开。

创建一个名为 items 的空列表来附加展平的字典。接下来,我们初始化一个 for 循环来遍历字典中的每个键,并将压缩后的键附加到空列表中。

然后,嵌套字典作为参数传递给用户定义的函数。扁平化字典打印在最后一行。

通过用户定义的函数展平嵌套字典

使用 Flatten-json 展平嵌套字典

flatten-json 是一个第三方库,可将复杂数据转换为表格。要使用 flatten-JSON 库,我们必须首先使用以下代码安装并导入包。

!pip install flatten_json
import flatten_json

导入包后,我们可以直接使用它来展平我们的嵌套字典。

1
2
3
4
5
6
7
8
9
10
11
12
nesteddict = {
    'a': {
        'b': 1,
        'c': {
            'd': 2,
            'e': 3
        }
    },
    'f': 4
}
flattened_dict = flatten_json.flatten(nesteddict, separator='_')
print("The flatttened dictionary is:\n",flattened_dict)

我们使用相同的嵌套字典并创建一个变量 来存储通过将此字典传递给带有下划线分隔符的flattened_dict新字典而获得的新字典。flatten_json

这个扁平化的字典在以下行中打印。

使用 Flatten-JSON 展平嵌套字典

使用 Pandas 展平嵌套字典

我们可以使用 Pandas 库的 JSON 标准化函数来展平嵌套字典。与上面的两个示例一样,键是用下划线压缩的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import pandas as pd
nesteddict = {
    'a': {
        'b': 1,
        'c': {
            'd': 2,
            'e': 3
        }
    },
    'f': 4
}
df = pd.json_normalize(nesteddict, sep='_')
flattened_dict = df.to_dict(orient='records')[0]
print("The flattened dictionary is :\n",flattened_dict)

在第一行中,我们将 Pandas 库导入为 pd,这是库的标准别名。

接下来,我们初始化一个名为nesteddict的变量来存储嵌套字典。

该字典通过该方法标准化pd.json_normalize并存储在名为 df 的变量中。然后 df 作为字典返回并打印在最后一行。

使用 Pandas 展平嵌套字典

使用 Prettyprint 展平嵌套字典

漂亮的打印模块可以使扁平化的词典看起来更漂亮。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import pprint
nested_dict = {
    'a': {
        'b': 1,
        'c': {
            'd': 2,
            'e': 3
        }
    },
    'f': 4
}
flattened_dict = flattendict(nested_dict)
print("The pretty flattened dictionary is:")
pprint.pprint(flattened_dict)

此示例是方法 1 – 用户定义函数的扩展。将嵌套字典传递给函数以返回扁平化字典后,该扁平化字典将传递给 pprint 模块以使其更漂亮。

通过 Prettyprint 展平嵌套字典

结论

总而言之,我们已经了解了嵌套字典以及嵌套字典如何帮助我们存储不同级别的分层数据。但我们人类可能很难理解这些数据。

我们需要以可理解的格式打印它或将其压平。在展平嵌套字典时,我们可以压缩字典的键,用下划线或您喜欢的任何其他分隔符分隔。这样做将产生一本人类可读和可理解的词典。

我们已经看到了一个简单的嵌套字典的示例,并了解了嵌套字典如何存储数据。

接下来,我们看到了一些通过压缩键来扁平化嵌套字典的方法。

在第一种方法中,我们创建了一个用户定义的函数,该函数使用分隔符分隔嵌套键并展平嵌套字典。

接下来,我们使用名为 flatten-json 的第三方库来展平嵌套字典。新字典具有原始字典,但具有使用分隔符格式化的嵌套键。

在第三种方法中,我们使用 Pandas 库的标准化方法来展平字典。

最后,漂亮的打印模块使扁平化的词典更加漂亮。

参考

有关 flatten-json 的更多信息可以在这里找到。

访问官方 Python 文档以了解有关 PrettyPrint 的更多信息。

请参阅有关同一主题的堆栈溢出答案链。