【问题标题】:Python: Split list of dicts by keyPython:按键拆分字典列表
【发布时间】:2021-02-25 00:26:25
【问题描述】:

如果我的列表中有一堆字典,例如:

people = [{"name": "Abe", "age": 40},
          {"name": "Bob", "age": 25},
          {"name": "Charles", "age": 32}]

我想把它拆分成这样的样子

names = ["Abe", "Bob", "Charles"]
ages = [40, 25, 32]

我知道我可以执行两个单独的列表解析(例如:names = [person["name"] for person in people] 两次),但是有什么技巧可以将这些数据拆分为单行吗?

【问题讨论】:

    标签: python python-3.x list dictionary


    【解决方案1】:

    您可以使用zip 技巧:

    >>> names, ages = zip(*(d.values() for d in people))
    >>> names
    ('Abe', 'Bob', 'Charles')
    >>> ages
    (40, 25, 32)
    

    请注意,这仅适用于 Python 3.7 及更高版本,因为在这些版本中字典为 insertion ordered

    【讨论】:

      【解决方案2】:

      您可以使用zipmap dict.values 到列表中:

      names, ages = zip(*map(dict.values, people))
      

      >>> names
      ('Abe', 'Bob', 'Charles')
      >>> ages
      (40, 25, 32)
      

      当然它们是元组,但是通过将列表映射到解压缩结果很容易解决:

      names, ages = map(list, zip(*map(dict.values, people)))
      

      >>> names
      ['Abe', 'Bob', 'Charles']
      >>> ages
      [40, 25, 32]
      

      【讨论】:

        【解决方案3】:

        假设您的 dicts 共享结构(相同的键集),您可以通过以下方式聚合每个键的值:

        >>> import operator
        >>> keys = people[0].keys()
        >>> getter = operator.itemgetter(*keys)
        >>> dict(zip(keys, zip(*map(getter, people))))
        {'name': ('Abe', 'Bob', 'Charles'), 'age': (40, 25, 32)}
        

        在任何 Python 中都可以使用(不需要有序的 dict),并且对于大量的键/变量来说很方便。

        【讨论】:

          【解决方案4】:

          您可以通过列表推导从字典中提取所需的字段名称来做到这一点:

          people = [{"name": "Abe", "age": 40},
                    {"name": "Bob", "age": 25},
                    {"name": "Charles", "age": 32}]
          
          names,ages = ([p[field] for p in people] for field in ("name","age"))
          
          print(names)  # ['Abe', 'Bob', 'Charles']
          
          print(ages)   # [40, 25, 32]
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-10-26
            • 2013-05-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-11-24
            • 2010-12-19
            相关资源
            最近更新 更多