选择满足某个条件的随机值的Pythonic方式
假设我有一个元素列表,我想从中随机选择一个符合某个条件的元素。用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)
谢谢!
5 个回答
我在文档里找不到一个叫 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的写法。如果我们分析一下这个算法,会发现它基本上是在做以下几件事:
- 先列出所有符合条件的元素。(这个过程的时间随着元素数量n的增加而线性增长)
- 从这个列表中随机选择一个元素。(这个过程的时间是固定的)
另外一种方法是先随机选择一个元素,然后判断它是否符合条件,如果不符合就再选一个。这种算法稍微复杂一些。如果列表中有90%的元素符合条件,这种方法会比你现在的方案快很多。但如果只有10%的元素符合条件,它的速度反而会慢,因为很有可能会多次随机选择到同一个元素,然后去判断它是否符合条件。你可以考虑把条件判断的结果缓存起来,但你还是会选择很多随机数据。总的来说:除非你的方案特别不适合你的数据,否则就继续用它,因为它真的很好。个人来说,我会把它改写成这样:
intlist = range(1,10)
randomeven = random.choice([i for i in intlist if i % 2 == 0])
这样写会简洁一些,但运行效果和你现有的代码是一样的。