【问题标题】:How to sort the outer and inner sublist of a nested list in Python?如何在 Python 中对嵌套列表的外部和内部子列表进行排序?
【发布时间】:2012-06-28 12:07:15
【问题描述】:

首先,如果这太天真了,请道歉(我是初学者)。 我有以下类型的列表,我想先按内部列表的最后一个成员升序排序:

data =  [[1, .45, 0], [2, .49, 2], [3, .98, 0], [4, .82, 1], [5, .77, 1], [6, .98, 2] ]

我通过使用:sorted(data,key=operator.itemgetter(2),reverse = True) 来完成此操作,这给了我:

[[1, .45, 0], [3, .98, 0],[4, .82, 1], [5, .77, 1], [2, .49, 2], [6, .98, 2]]

现在,我想在子列表中进行排序,即首先使用中间成员作为键,以降序对列表的最后一个成员为“0”进行排序。然后以“1”作为最后一个成员对子列表进行排序,依此类推。请注意,每个子列表中的元素数量不同且未知。最终列表应如下所示:

[[3, .98, 0],[1, .45, 0], [4, .82, 1], [5, .77, 1], [6, .98, 2],[2, .49, 2] ]

该列表实际上非常庞大,因此我正在寻找一种有效的实现方式。 任何指导将不胜感激!

【问题讨论】:

  • 我认为你的第二个例子是倒退的……你倒序排序对吗?
  • 抱歉,我想我在打字时犯了一个错误。它应该是 reverse = False。
  • 只是为了更深入地研究这个(因为已经提供了答案),在这一步之前你到底想做什么?可能有更好的方法来实现您的目标,而不是担心内部排序组件。例如,如果您从某个地方读取此数据,则在加载时进行排序可能是有意义的。也可以使用生成器而不是列表/字典。如果您发布另一个问题,询问“是否有更好的方法来实现 X”,这可能会有所帮助。只是一个想法:)
  • @JoshSmeaton:非常感谢您的建议!我正在生成这些列表,这些列表通过计算形成字典中的值,可以认为对于 someset(A) 中的 avalues ,对于 someset(B) 中的 bvalues 返回 avalues + bvalues 即返回所有的总和两组中的成对组合。然后,键将是 setA 中的值,列表将是其 [所有元素的相应总和,与 setB 的相应元素配对]。我也将尝试形成一个单独的问题,但非常感谢任何反馈!
  • @R.Bahl 你可能想看看 itertools 包 - 它可能有一些对你有用的功能。例如,有效地生成成对组合。您最初从哪里获取数据也应该是一个可能的优化位置。在没有更多上下文的情况下,这个问题对我来说似乎很抽象。但是,就像我建议的那样,可能另一个问题可能会产生一些不错的解决方案。祝你好运。

标签: python list sorting dictionary key


【解决方案1】:

您可以传递排序的多个键:

data =  [[1, .45, 0], [2, .49, 2], [3, .98, 0], [4, .82, 1], [5, .77, 1], [6, .98, 2] ]
sorted(data, key=lambda x: (x[2], -x[1]))

[[3, 0.98, 0],
 [1, 0.45, 0],
 [4, 0.82, 1],
 [5, 0.77, 1],
 [6, 0.98, 2],
 [2, 0.49, 2]]

【讨论】:

    【解决方案2】:
    >>> data =  [[1, .45, 0], [2, .49, 2], [3, .98, 0], [4, .82, 1], [5, .77, 1], [6, .98, 2] ]
    >>> sorted(data, key=lambda x:(x[2], -x[1]))
    [[3, 0.98, 0], [1, 0.45, 0], [4, 0.82, 1], [5, 0.77, 1], [6, 0.98, 2], [2, 0.49, 2]]
    

    您可以根据需要向 lambda 添加额外的术语

    【讨论】:

    • 嘎。你在 6 分钟前输入了这个,它在我提交这个(滞后)时通知了我。几乎一字不差
    • 谢谢!!这完美地工作。只是为了跟进我之前的评论,即列表很大,对于初学者来说,我将它们作为键存储在字典中:值对 其中,值是这些列表,键是一些数字。由于键的数量和列表的大小达到数千,因此从 ram 中读取它们很快变得不可行。最优化的方法应该是什么?在对与每个键关联的列表进行排序时,我有点犹豫是否将这些庞大的字典存储在内存中。
    • @R.Bahl:通过:aList.sort(...) 对每一个进行排序?这样您就不会产生任何过度重复的内存。
    • @jdi:我同意你的看法。但是,由于键的数量很大(> 10,000),并且与键的值对应的每个列表可能包含> 20,000个小的内部列表(我们刚刚排序),那么在内存中执行它是一种接近它的好方法吗?
    • @R.Bahl,如果您有足够的 RAM,最好在内存中进行排序。听起来您需要相当多的 RAM 才能执行此操作,但也许 16GB 左右是可能的
    猜你喜欢
    • 1970-01-01
    • 2010-09-21
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    相关资源
    最近更新 更多