【问题标题】:Python: how to select n number of elements of each type from OrderedDict?Python:如何从 OrderedDict 中选择每种类型的 n 个元素?
【发布时间】:2022-01-07 14:25:37
【问题描述】:

我有一个 Django 序列化程序从 serializer.data 返回一个 OrderedDict。它可以包含例如这种类型的数据:

[OrderedDict([('id', '1'), ('date', '2022-01-08'), ('type', 'A')]), OrderedDict([('id', '2'), ('date', '2022-01-09'), ('type', 'A')]), OrderedDict([('id', '3'), ('date', '2022-01-08'), ('type', 'B')]), OrderedDict([('id', '4'), ('date', '2022-01-09'), ('type', 'B')]),
OrderedDict([('id', '5'), ('date', '2022-01-08'), ('type', 'C')]), OrderedDict([('id', '6'), ('date', '2022-01-09'), ('type', 'C')])]

我想取出每个 type 的第一个元素,并从该数据中创建一个 json。我可以使用 for -loops 来遍历 dict 并创建一个新列表,其中包含每种类型的一个元素:A、B 和 C。我想知道是否有一些更简洁的方法来遍历 dict 并选择 n每个type的号码?

【问题讨论】:

    标签: python django loops dictionary ordereddictionary


    【解决方案1】:

    您可以将islice 与生成器一起用于该列表:

    from collections import OrderedDict 
    import itertools as it 
    
    odl=[OrderedDict([('id', '1'), ('date', '2022-01-08'), ('type', 'A')]), OrderedDict([('id', '2'), ('date', '2022-01-09'), ('type', 'A')]), OrderedDict([('id', '3'), ('date', '2022-01-08'), ('type', 'B')]), OrderedDict([('id', '4'), ('date', '2022-01-09'), ('type', 'B')]),
    OrderedDict([('id', '5'), ('date', '2022-01-08'), ('type', 'C')]), OrderedDict([('id', '6'), ('date', '2022-01-09'), ('type', 'C')])]
    
    n=3
    
    >>> list(it.islice((t for od in odl for t in od.items() if t[0]=='type'),0,n))
    [('type', 'A'), ('type', 'A'), ('type', 'B')]
    

    如果您希望获得每种类型的 n,请使用 groupby 和相同的 islice

    n=1
    for k,v in it.groupby(sorted(odl, key=lambda od: od['type']), key=lambda od: od['type']):
        print(list(it.islice((t for od in v for t in od.items() if t[0]=='type'),0,n)))
    

    打印:

    [('type', 'A')]
    [('type', 'B')]
    [('type', 'C')]
    

    【讨论】:

      猜你喜欢
      • 2014-05-01
      • 2017-06-10
      • 2011-03-28
      • 2020-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-20
      • 1970-01-01
      相关资源
      最近更新 更多