是否可以使用随机模块从列表中提取字符串,但前提是字符串的长度大于x?
例如:
list_of_strings = ['Hello', 'Hello1' 'Hello2']
如果您设置x = 5
并致电random.choice()
,则代码将选择'仅在list_of_strings[1]
和list_of_strings[2]
之间。
我意识到你可以制作第二个列表,其中只包含len > x
的值,但我想知道没有这一步是否可行。
答案 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
应用于每个元素。它的价格足以超过不创建第二个列表的收益。
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])