【问题标题】:Sorting one list to match another in python在python中对一个列表进行排序以匹配另一个列表
【发布时间】:2013-04-08 13:53:08
【问题描述】:

假设我有这些列表:

ids = [4, 3, 7, 8]
objects = [
             {"id": 7, "text": "are"},
             {"id": 3, "text": "how"},
             {"id": 8, "text": "you"},
             {"id": 4, "text": "hello"}
          ]

我怎样才能对objects 进行排序,使其ID 的顺序与ids 匹配? IE。得到这个结果:

objects = [
             {"id": 4, "text": "hello"},
             {"id": 3, "text": "how"},
             {"id": 7, "text": "are"},
             {"id": 8, "text": "you"}
          ]

【问题讨论】:

    标签: python list sorting


    【解决方案1】:
    object_map = {o['id']: o for o in objects}
    objects = [object_map[id] for id in ids]
    

    【讨论】:

    • 我想我会把 dict-comp 排除在外,这样你就不会一遍又一遍地做。
    【解决方案2】:
    In [25]: idmap = dict((id,pos) for pos,id in enumerate(ids))
    
    In [26]: sorted(objects, key=lambda x:idmap[x['id']])
    Out[26]: 
    [{'id': 4, 'text': 'hello'},
     {'id': 3, 'text': 'how'},
     {'id': 7, 'text': 'are'},
     {'id': 8, 'text': 'you'}]
    

    【讨论】:

    • 奇怪的是,我在文本编辑器中的字符几乎是 char ;)
    • @JonClements:我们显然在这个网站上花费了太多时间;)
    【解决方案3】:
    >>> ids = [4,3,7,8]
    >>> id_orders = {}
    >>> for i,id in enumerate(ids):
    ...     id_orders[id] = i
    ... 
    >>> id_orders
    {8: 3, 3: 1, 4: 0, 7: 2}
    >>> 
    >>> sorted(objs, key=lambda x: id_orders[x['id']])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      相关资源
      最近更新 更多