【问题标题】:Python list of dictionaries projection, filter, or subset?Python 字典列表投影、过滤器或子集?
【发布时间】:2013-07-13 15:11:06
【问题描述】:

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

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']

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

【问题讨论】:

    标签: python functional-programming functools


    【解决方案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'}]
    

    【讨论】:

      【解决方案2】:

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

      >>> [{"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)
      

      【讨论】:

      • 你的lambda版本返回[set(['Al', 'name']), set(['Bert', 'name']), set(['Charles', 'name'])],嗯,把逗号换成冒号吧。
      • @Mittenchops:哎呀,修复了。
      • 请注意,由于 python 3 map 返回一个地图对象。如果你想要一个列表,你必须这样做list(map(lambda d: {"name": d["name"]}, mine))
      【解决方案3】:

      代码:

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

      输出:

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

      【讨论】:

        猜你喜欢
        • 2023-03-23
        • 1970-01-01
        • 2022-07-15
        • 2017-10-29
        • 1970-01-01
        • 2015-12-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多