📜  Python – 用列表展平字典(1)

📅  最后修改于: 2023-12-03 15:19:06.209000             🧑  作者: Mango

Python – 用列表展平字典

在Python中,字典是一个非常方便的数据结构。但是,当我们需要将一个字典展平成一个列表时,可能会感到有些困难。在本文中,我们将介绍用Python将字典展平成一个列表的方法。

方法1:使用递归函数

一种常见的方法是递归函数。这个函数将以字典作为输入,并返回一个列表,其中每个元素都是一个元组,包含字典中每个键值对的键和值。

def flatten_dict(d, parent_key='', sep='_'):
    items = []
    for k, v in d.items():
        new_key = f"{parent_key}{sep}{k}" if parent_key else k
        if isinstance(v, collections.MutableMapping):
            items.extend(flatten_dict(v, new_key, sep=sep).items())
        else:
            items.append((new_key, v))
    return dict(items)
方法2:使用迭代器

另一种方法是使用迭代器。这个函数将以字典作为输入,并返回一个迭代器,该迭代器将按顺序生成字典中每个键值对的键和值。

def flatten_dict_iter(d, parent_key='', sep='_'):
    items = []
    for k, v in d.items():
        new_key = f"{parent_key}{sep}{k}" if parent_key else k
        if isinstance(v, collections.MutableMapping):
            items.extend(flatten_dict_iter(v, new_key, sep=sep))
        else:
            items.append((new_key, v))
    return items
示例

假设我们有一个字典,它表示一组科目和具有其分数的学生:

scores = {
  "Math": {
    "Alice": 80,
    "Bob": 70,
    "Carol": 90
  },
  "English": {
    "Alice": 90,
    "Bob": 80,
    "Carol": 70
  },
  "Science": {
    "Alice": 70,
    "Bob": 90,
    "Carol": 80
  }
}

我们可以使用这两个方法之一来将其展平:

import collections

# 使用递归函数
flat_dict = flatten_dict(scores)
print(flat_dict)

# 使用迭代器
flat_dict = dict(flatten_dict_iter(scores))
print(flat_dict)

输出结果如下:

{
    'Math_Alice': 80,
    'Math_Bob': 70,
    'Math_Carol': 90,
    'English_Alice': 90,
    'English_Bob': 80,
    'English_Carol': 70,
    'Science_Alice': 70,
    'Science_Bob': 90,
    'Science_Carol': 80
}
结论

本文介绍了两种将字典展平的方法:使用递归函数和使用迭代器。这些方法可以大大简化对包含字典的数据结构的操作。