选择满足某个预测的随机值的python方法

2024-10-03 13:26:42 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个元素列表,我想从列表中随机选择一个满足谓词的元素。Python的这种方式是什么?在

我现在做了一个理解,后面跟着一个random.choice(),但这是不必要的低效:

intlist = [1,2,3,4,5,6,7,8,9]
evenlist = [ i for i in intlist if i % 2 == 0 ] 
randomeven = random.choice(evenlist)

谢谢!在


Tags: in元素列表forif方式random谓词
3条回答

我在文档中找不到类似random.selectspecific(list, predicate)的函数,因此我尝试以下方法:

import random
def selectspecific(l, predicate):
    result = random.choice(l)
    while (not predicate(result)):
        result = random.choice(l)
    return result
import random

intlist = [1,2,3,4,5,6,7,8,9]
randomeven = random.choice(filter(lambda x: x % 2 == 0, intlist))                                                                                                                                                         

上面的编写方法实际上是很好的惯用python。如果我们分析这个算法,我们会发现它实际上是这样做的:

  1. 生成满足谓词的元素列表。(与n成线性增长)
  2. 从列表中选择一个随机元素。(恒定时间)

唯一的另一种方法是随机选择一个元素,判断它是否满足谓词,如果不满足则再次选择。这个算法稍微复杂一点。如果列表中有90%满足谓词,这将比您的解决方案运行得快得多。在只有10%的列表满足谓词的情况下,它实际上运行得会慢得多,因为它很有可能随机选择一个给定的元素,并检查谓词是否在该元素上满足多次。现在你可以考虑记住你的谓词,但是你仍然要选择大量的随机数据。归根结底是这样的:除非你的解决方案特别不适合你的数据,否则坚持下去,因为它很棒。就我个人而言,我会这样重写:

intlist = range(1,10)
randomeven = random.choice([i for i in intlist if i % 2 == 0])

这是一个更简洁的,但它将运行与您的现有代码完全相同。在

相关问题 更多 >