【问题标题】:Sorting dictionary values according to the values of one of the keys ckeys根据键 ckeys 之一的值对字典值进行排序
【发布时间】:2022-01-06 10:44:49
【问题描述】:

我收到一个包含两个键的字典,其中包含列表列表作为值。 示例:

dict = {'points' : [[2,1],[3,4], [5,6],[7,8]], 'ids':[[2], [1], [3], [0]]}

每个点都有一个与之关联的 id,例如:点 [2,1] 有 id[2],点[3,4] 有 id[1] 等等。

我需要根据每个 id 对点进行排序。所以我需要的输出是这样的

dict = {'points' : [[7,8],[3,4], [2,1],[5,6]], 'ids':[[0], [1], [2], [3]]}

我该怎么做?

谢谢。

【问题讨论】:

    标签: python list sorting dictionary key-value


    【解决方案1】:

    Python 可以在一行中做到这一点:

    >>> d = {'points' : [[2,1],[3,4], [5,6],[7,8]], 'ids':[[2], [1], [3], [0]]}
    >>> d['ids'], d['points'] = zip(*sorted(zip(d['ids'], d['points'])))
    >>> d
    {'points': ([7, 8], [3, 4], [2, 1], [5, 6]), 'ids': ([0], [1], [2], [3])}
    

    zip 步骤将 idspoints 成对组合在一起。 sorted 步骤按每对的第一个元素 id 排序。 zip(*s) 步骤将 idspoints 拆分并返回到单独的序列中。

    请注意,内部数据类型已从列表转换为元组。如果不需要,您可以调用 list 将它们转换回来。

    【讨论】:

      【解决方案2】:

      试试这个:

      d['ids'], d['points'] = map(list, zip(*sorted(zip(d['ids'], d['points']))))
      

      请不要使用内置函数名称(例如dict)来命名您的变量。这里我改用d

      正如 Kelly 在下面的 cmets 中所建议的,这也是一种选择:

      d['ids'][:], d['points'][:] = zip(*sorted(zip(d['ids'], d['points'])))
      

      【讨论】:

      • 也可以分配到现有列表中,那么您就不需要地图了。
      • @KellyBundy 感谢您的评论。虽然不确定你的意思。你能给我看看代码吗?或者随意直接编辑答案(并获得学分)
      • 分配给d['ids'][:]而不是d['ids']
      • @KellyBundy 哦,这很有道理,对!谢谢
      【解决方案3】:

      请不要使用内置名称作为变量名!

      data = {'points' : [[2,1],[3,4], [5,6],[7,8]], 'ids':[[2], [1], [3], [0]]}
      ids, points = zip(*sorted(zip(data['ids'], data['points'])))
      print({
          'points': list(points),
          'ids': list(ids),
      })
      # output: {'points': [[7, 8], [3, 4], [2, 1], [5, 6]], 'ids': [[0], [1], [2], [3]]}
      

      首先你创建zip 对象 - 它代表对象的“对”(或 n 元组,如果给出更多参数),因此每个点都绑定到 id。然后sorted() 按第一个元素(即 id)对它们进行排序(我们可以传递额外的key 参数以保持顺序相同)。最后,我们将排序结果拆分回两个数组(再次应用zip 恢复初始配置),将它们分配给变量并创建所需的字典。

      【讨论】:

      • 您可能希望通过解释解决方案来增强您的答案。
      • 为了清楚一点,输出有点不同,这不是你报告的。具体来说,points 和 ids 都是列表的元组,而不是列表的列表。
      • @RiccardoBucco 谢谢!你是对的,解决了这个问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      相关资源
      最近更新 更多