4

我正在尝试创建我认为从较大字典空间到较小维度空间的“投影”。所以,如果我有:

mine = [
{"name": "Al", "age": 10},
{"name": "Bert", "age": 15},
{"name": "Charles", "age": 17}
]

我试图找到一个函数表达式只返回:

[
{"name": "Al"},
{"name": "Bert"},
{"name": "Charles"}
]

我试过了...

>>> filter(lambda x: x['name'],mine)
[{'age': 10, 'name': 'Al'}, {'age': 15, 'name': 'Bert'}, {'age': 17, 'name': 'Charles'}]
>>> map(lambda x : x['name'],mine)
['Al', 'Bert', 'Charles']

但似乎仍然缺少正确的功能。我知道如何通过列表理解来做到这一点,但想学习如何在功能上做到这一点。

4

3 回答 3

15

听起来像是列表推导的工作,不管你喜不喜欢。

>>> [{"name": d["name"]} for d in mine]
[{'name': 'Al'}, {'name': 'Bert'}, {'name': 'Charles'}]

没有列表理解的解决方案将需要一个额外的函数定义:

def project(key, d):
    return {k: d[k]}

map(partial(project, "name"), mine)

lambda(恶心):

map(lambda d: {"name": d["name"]}, mine)
于 2013-07-15T16:56:17.647 回答
1

代码:

print([{'name': d['name']} for d in mine])

输出:

[{'name': 'Al'}, {'name': 'Bert'}, {'name': 'Charles'}]
于 2013-07-15T16:56:39.950 回答
1

如果我们想保留多个密钥:

input_dicts = [
    {"name": "Al", "age": 40, "level": "junior"},
    {"name": "Bert", "age": 30, "level": "mid"},
    {"name": "Charles", "age": 20, "level": "senior"}
]

selected_keys = ("name", "level")

[
    {key: value for key, value in a_dict.items() if key in selected_keys}
    for a_dict in input_dicts
]
[{'name': 'Al', 'level': 'junior'},
 {'name': 'Bert', 'level': 'mid'},
 {'name': 'Charles', 'level': 'senior'}]
于 2021-10-01T14:36:12.617 回答