使用模式制作列表

时间:2015-10-06 02:39:45

标签: python list function

我正在尝试创建一个函数,根据另一个列表的长度创建一个基于模式的列表。由于模式的性质,我不确定如何做到这一点。我试图制作类似的东西:

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,所以我不能只使用像这样的设定长度的默认列表。有没有更好的方法来设置这样的模式?

5 个答案:

答案 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]