📜  Python – 从嵌套项中过滤键(1)

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

Python – 从嵌套项中过滤键

在Python中,我们可以使用嵌套的字典或列表来存储数据。然而,当我们需要从这些嵌套的数据结构中过滤出特定的键或值时,这可能会变得相当棘手。在本文中,我们将讨论如何从嵌套的数据结构中过滤出指定的键。

假设我们有以下嵌套字典:

data = {
    "name": "John",
    "age": 30,
    "address": {
        "street": "123 Main St.",
        "city": "Anytown",
        "state": "CA"
    },
    "phone_numbers": [
        "555-1234",
        "555-5678"
    ]
}

如果我们想要过滤出所有的键,我们可以使用Python的keys()方法。例如,下面的代码将返回data字典中的所有键:

all_keys = data.keys()
print(all_keys)
# Output: dict_keys(['name', 'age', 'address', 'phone_numbers'])

但是,有时我们并不需要所有的键。例如,假设我们只想过滤出address字典中的所有键。这就需要一些额外的操作。我们可以使用嵌套函数和递归来实现这个过滤器。

def filter_keys(data, keys):
    result = {}
    for key, value in data.items():
        if key in keys:
            result[key] = value
        elif isinstance(value, dict):
            nested = filter_keys(value, keys)
            if nested:
                result[key] = nested
        elif isinstance(value, list):
            nested = []
            for item in value:
                if isinstance(item, dict):
                    filtered = filter_keys(item, keys)
                    if filtered:
                        nested.append(filtered)
            if nested:
                result[key] = nested
    return result

这个函数接受两个参数:要过滤的数据以及要过滤的键列表。它遍历字典中的每个键值对,并检查该键是否需要过滤。如果是,它将键值对添加到结果字典中。如果值是另一个字典或列表,则递归地调用该函数以过滤该嵌套结构中的键。

我们可以使用这个过滤函数来过滤我们的data字典。例如,下面的代码将返回address字典中的所有键:

keys_to_filter = ["street", "city", "state"]
filtered_keys = filter_keys(data["address"], keys_to_filter)
print(filtered_keys)
# Output: {'street': '123 Main St.', 'city': 'Anytown', 'state': 'CA'}

在上面的例子中,我们针对嵌套字典进行了过滤。如果我们要过滤嵌套列表中的键,我们需要对过滤函数进行一些修改。下面是修改后的过滤函数:

def filter_keys(data, keys):
    result = {}
    for key, value in data.items():
        if key in keys:
            result[key] = value
        elif isinstance(value, dict):
            nested = filter_keys(value, keys)
            if nested:
                result[key] = nested
        elif isinstance(value, list):
            nested = []
            for item in value:
                if isinstance(item, dict):
                    filtered = filter_keys(item, keys)
                    if filtered:
                        nested.append(filtered)
                else:
                    nested.append(item)
            if nested:
                result[key] = nested
    return result

这个函数与之前的版本类似,但增加了对列表的检查。它遍历列表中的每个项,并对其中的字典递归调用过滤函数,同时将其他类型的项添加到结果列表中。

下面的代码演示了如何使用这个过滤函数来过滤phone_numbers列表中的所有键:

keys_to_filter = ["0", "1"]
filtered_keys = filter_keys(data["phone_numbers"], keys_to_filter)
print(filtered_keys)
# Output: ['555-1234', '555-5678']

使用这些技术,我们可以轻松地从嵌套的数据结构中筛选出需要的键值。