【问题标题】:Choosing a maximum randomly in the case of a tie?在平局的情况下随机选择最大值?
【发布时间】:2016-02-01 19:00:33
【问题描述】:

从实验中我发现,在平局的情况下, python 根据顺序选择(例如列表中第一个出现的项目) 有没有办法,在平局的情况下,我可以随机选择一个项目,这样它就不是确定性的并且基于顺序?

例如

l = [ ([1], 10) , ([2], 3), ([3], 9), ([4], 10)] 
max(l, key=lambda x: x[1])

每次运行,都可以返回 ([4], 10) 或 ([1], 10) 并不总是 ([1], 10)

【问题讨论】:

  • 我不认为您可以直接执行此操作(即,告诉max 随机执行此操作)但您可以执行max 后跟filter 后跟random.choice .

标签: python list max tuples min


【解决方案1】:

在选择最大值之前将列表打乱:

import random
random.shuffle(l)

【讨论】:

    【解决方案2】:

    您需要先找到所有最大值,然后随机选择一个:

    from operator import itemgetter
    from random import choice
    
    l = [([1], 10) , ([2], 3), ([3], 9), ([4], 10)] 
    
    mx = max(l, key=itemgetter(1))
    
    all_maxes = [ele for ele in l  if ele[1] == mx[1]]
    
    print(choice(all_maxes))
    

    【讨论】:

      【解决方案3】:

      您可以为键值添加一点随机性:

      max(l, key=lambda x: x[1] + random.random())
      

      或者更一般地说,如果您的键不仅仅是整数:

      max(l, key=lambda x: (x[1], random.random()))
      

      【讨论】:

      • 这可能(通常)导致非最大项目超过真正的最大值。
      • 它怎么会导致非最大项目超过真正的最大值?我刚刚运行了多次迭代,在每次迭代中,最大值似乎都是正确的
      • @user,0.7 被添加到 2.5,0.1 被添加到 3,返回的最大值是多少?整数可以,但正如 chepner 所说,一般来说不是一个好方法
      • @chepner 我认为这很明显,但感谢您的推动:-)。我现在添加了一个通用变体。
      • 这是一个很好的解决方法。它适用于任何类型,而不仅仅是数字。
      猜你喜欢
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 2021-08-31
      • 1970-01-01
      • 2021-05-29
      相关资源
      最近更新 更多