代码之家  ›  专栏  ›  技术社区  ›  SledgeHammer

python有没有什么技巧可以将字典展平并同时对其进行排序?

  •  -1
  • SledgeHammer  · 技术社区  · 4 年前

    我有这本字典:

    s = [{"label":["College Name"],"points":[{"start":939,"end":956,"text":"Kendriya Vidyalaya"}]},{"label":["College Name"],"points":[{"start":883,"end":904,"text":"Woodbine modern school"}]}]
    

    for annotation in sorted(s, key = lambda tup: tup['points'][0]['start']):
        print(annotation)
    

    有什么很酷的python技巧可以从字典中解包值并同时对其中一个值进行排序吗?

    2 回复  |  直到 4 年前
        1
  •  0
  •   Scott Hunter    4 年前

    for annotation in sorted(s, key = lambda tup: tup['points'][0]['start']):
        print(annotation["label"],annotation["points"][0]["start"],annotation["points"][0]["end"])
    

    或者,只需要识别 start 按姓名一次:

    for annotation in sorted([(x["label"][0],x["points"][0]["start"],x["points"][0]["end"]) for x in s], key = lambda tup: tup[1]):
        print(annotation)
    
        2
  •  0
  •   John Kugelman Michael Hodel    4 年前

    诀窍是打开包装 第一 .

    (item['label'], item['points'][0]['start'], item['points'][0]['end'])
    

    我们如何将这样的规则应用于整个列表?使用表达式生成器或表达式列表:

    (
        (item['label'], item['points'][0]['start'], item['points'][0]['end'])
        for item in s
    )
    

    我们如何对这些结果进行排序?使用 sorted 分类

    sorted(
        (
            (item['label'], item['points'][0]['start'], item['points'][0]['end'])
            for item in s
        ),
        key = lambda filtered: filtered[1]
    )
    
        3
  •  0
  •   Alain T.    4 年前

    假设字典键始终按所示顺序排列,则可以将字典列表转换为重新排列的元组列表(以“开始”键/值对开头)。然后对元组进行排序,并从中重新形成字典。

    s = [{"label":["College Name"],
         "points":[{"start":939,"end":956,"text":"Kendriya Vidyalaya"}]},
         {"label":["College Name"],
          "points":[{"start":883,"end":904,"text":"Woodbine modern school"}]}]
    
    r = [*map(dict,sorted( ((*pd.items(),(lb,lv)) for d in s   
                           for (lb,(lv,*_)),(_,(pd,*_)) in [(*d.items(),)])))]
    
    print(r)
    
    [{'start': 883, 'end': 904, 'text': 'Woodbine modern school',
      'label': 'College Name'},
     {'start': 939, 'end': 956, 'text': 'Kendriya Vidyalaya', 
      'label': 'College Name'}]
    

    r = sorted(({k:v for k,(v,*_) in d.items()} for d in s),
                key=lambda d:d["points"]["start"])
    
    print(r)
    
    [{'label': 'College Name', 
      'points': {'start': 883, 'end': 904, 'text': 'Woodbine modern school'}}, 
     {'label': 'College Name', 
      'points': {'start': 939, 'end': 956, 'text': 'Kendriya Vidyalaya'}}]