【问题标题】:Introducing some randomness with sorting in Python在 Python 中通过排序引入一些随机性
【发布时间】:2014-04-09 02:09:06
【问题描述】:

使用这段代码,我得到了基于元素长度的排序列表。

>>> a = [[1,2,3],[3,4,5,6],[7,8],[9,10,11]]
>>> print sorted(a, key=lambda m: len(m))
[[7, 8], [1, 2, 3], [9, 10, 11], [3, 4, 5, 6]]

在对list的列表进行排序时,我需要在元素长度相同的情况下引入一些随机性。对于前面的例子。我需要得到排序结果

[[7, 8], [1, 2, 3], [9, 10, 11], [3, 4, 5, 6]]

[[7, 8], [9, 10, 11], [1, 2, 3], [3, 4, 5, 6]]

随机。

如何在 Python 中做到这一点?

【问题讨论】:

  • 您希望它保持一致吗?还是您希望它在每次运行排序时都可能发生变化?
  • 那么您希望列表中的每个列表都是随机的吗?还是只是主列表的全部内容? 1:[[8, 7], [4, 3, 6, 5], [11, 9, 10], [1, 2, 3]] 2:[[7, 8], [3, 4, 5, 6], [9, 10, 11], [1, 2, 3]]

标签: python sorting


【解决方案1】:

Python 的排序函数是稳定的,这意味着对于比较相等的元素,顺序与原始列表保持不变。因此,您可以将列表打乱,然后根据长度进行排序。

import random

a = [[1,2,3],[3,4,5,6],[7,8],[9,10,11]]
random.shuffle(a)
a.sort(key = len)

请注意,此代码对列表 a 原地打乱和排序。

【讨论】:

    【解决方案2】:
    import random    
    print sorted(a, key=lambda m: (len(m), random.random()))
    

    【讨论】:

      【解决方案3】:

      这是一种“显而易见”的方式。在您的示例中,它将以相等的概率产生两种可能的结果:

      from random import random
      a = [[1,2,3],[3,4,5,6],[7,8],[9,10,11]]
      print(sorted(a, key=lambda m: (len(m), random())))
      

      由于元组比较的工作方式,当元素与长度相关时,比较会继续比较调用 random() 的结果。

      【讨论】:

      • 一开始我并不确定这是否可行,但我检查了文档,确实关键功能只对列表中的每个项目进行了一次评估。
      • @GeoffReedy,是的,很高兴指出这一点!谢谢。
      猜你喜欢
      • 2014-08-04
      • 1970-01-01
      • 2013-07-17
      • 2012-12-09
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 2019-09-19
      相关资源
      最近更新 更多