从符合条件的列表中提取随机值?蟒蛇

时间:2016-03-30 14:03:28

标签: python random

是否可以使用随机模块从列表中提取字符串,但前提是字符串的长度大于x?

例如:

list_of_strings = ['Hello', 'Hello1' 'Hello2']

如果您设置x = 5并致电random.choice(),则代码将选择'仅在list_of_strings[1]list_of_strings[2]之间。

我意识到你可以制作第二个列表,其中只包含len > x的值,但我想知道没有这一步是否可行。

3 个答案:

答案 0 :(得分:4)

std::locale("C")

或者你可以这样做:

random.choice([s for s in list_of_strings if len(s) > x])

如果列表中的字符串长于x,则应首先检查,否则该代码将永远不会结束。

另一种可能的解决方案是使用油藏采样,它具有有限的运行时间的额外好处。

答案 1 :(得分:1)

另一种不会创建额外列表的解决方案:

from itertools import islice
from random import randrange

def choose_if(f, s):
  return next(islice(filter(f, s), randrange(sum(map(f, s))), None))

choose_if(lambda x: len(x) > 5, list_of_strings)

事实证明它几乎比Christian的解决方案快两倍。这是因为它迭代s两次,将f应用于每个元素。它的价格足以超过不创建第二个列表的收益。

另一方面,Francisco的解决方案可以比这快10到100倍,因为它只应用f次数,因为它无法选择合适的元素。这是该功能的完整版本:

from random import choice

def choose_if(f, s):
  if any(filter(f, s)):
    while True:
      x = choice(s)
      if f(x): return x

请记住,当少数(少于1%)元素满足条件时,它会变得更糟。当5000中只有1个元素是好的时候,它比使用列表理解慢5倍。

答案 2 :(得分:0)

你可以这样做:

random.choice([i for i in list_of_strings if len(i) > x])