我正在尝试创建一个函数,根据另一个列表的长度创建一个基于模式的列表。由于模式的性质,我不确定如何做到这一点。我试图制作类似的东西:
len(a_list) = 50
created_pattern_a_list = [1,2,4,8,10,20,40]
len(b_list) = 9000
created_patten_b_list = [1,2,4,8,10,20,40,80,100,200,400,800,1000,2000,4000,8000]
所以我想要的模式是1,2,4,8,10,......那么它是指数但只有在它的下一次幂为10时,它才以10的幂开始。我我不确定如何制作一个可以做到这一点的功能。类似的东西:
def create_patten_list(a_list):
reff_list = [1,2,4,8,10,20,40,80,100,200,400,800,1000,2000,4000,8000,10000]
corr_list = [a for a in reff_list if a <= len(a_list)]
return corr_list
但是a_list的长度可能远远超过10000,所以我不能只使用像这样的设定长度的默认列表。有没有更好的方法来设置这样的模式?
答案 0 :(得分:3)
我确信这不是最优雅的解决方案,但请考虑一下: 模板的重复部分只有1,2,4和8.其余部分只是数量级。
def get_pattern(length):
template = [1, 2, 4, 8]
output = []
i = 0
while True:
num = template[i%4] * 10**(i//4)
if num > length:
break
output += [num]
i += 1
return output
所以:
>>> get_pattern(5000)
[1, 2, 4, 8, 10, 20, 40, 80, 100, 200, 400, 800, 1000, 2000, 4000]
答案 1 :(得分:0)
你可以这样做:
$start_search
所以
$start_search ='<TBODY>';
答案 2 :(得分:0)
这个怎么样:
perimeter
答案 3 :(得分:0)
如果您喜欢滥用itertools
,则可以使用此解决方案。
from itertools import count, repeat, cycle, izip
def get_pattern(length):
repeated_multiplier = (y for x in count(0) for y in repeat(x, 4))
repeat_1248 = cycle([1, 2, 4, 8])
number_generator = izip(repeat_1248, repeated_multiplier)
values = []
while True:
x = next(number_generator)
x = x[0] * 10**x[1]
if x > length:
break
values.append(x)
return values
答案 4 :(得分:0)
以下内容将为您提供所需的结果:
from itertools import takewhile, cycle
def create_patten_list(a_list):
length = len(a_list)
sequence = [1,2,4,8]
return [x[1] * 10 ** (x[0] // 4) for x in takewhile(lambda x: x[1] * 10 ** (x[0] // 4) <= length, enumerate(cycle(sequence)))]
print create_patten_list(range(50))
print create_patten_list(range(9000))
提供以下输出:
[1, 2, 4, 8, 10, 20, 40]
[1, 2, 4, 8, 10, 20, 40, 80, 100, 200, 400, 800, 1000, 2000, 4000, 8000]