如何在Python中生成特定的数字组合

时间:2017-07-09 22:54:08

标签: python list numbers

我正在尝试做的是一个函数,你给它一个数字,它列出了包含数字的那个长度的每个字符串按升序排列,条件是我不能超过4次相同的数字和我的数字必须是连续的。如果可能的话,我不想列出那些已经列出的数字的数字。

例如: fct(5)给了我 “11112 11122 11123 11223(省略11222) 11233 11234 12223 12234 12345"

你认为使用正则表达式更好并生成每个组合或者在我浏览初始列表并修改它时增加列表中的数字吗?

其他语言是否更适合做这样的事情?

编辑:抱歉,我觉得还不够清楚。 我开始尝试做类似的事情:

ls = list("1111222233334")
i = -1
while ls[0] == "1":
    print("".join(ls))
    if int(ls[i]) == int(ls[i-1]) and int(ls[i]) < 9:
        ls[i] = str(int(ls[i])+1)
    else:
        i -= 1

当然这不起作用,我认为如果我这样做有太多的条件,这就是为什么我问在Python中是否已经完成了可以列出每个特定长度的增加数量的东西。 我们不能超过9,所以如果用37调用,这个函数可以做任何事情。

通过anacycle,我的意思是,如果从头开始读取(如“roma”和“amor”),则会提供其他内容。

生成一个包含该长度的每个数字的列表,然后删除所有那些不对应的列表,+删除与那些已经存在的那些相同的那些更好吗?

1 个答案:

答案 0 :(得分:0)

我最终决定这样做:

def handlisting(n):
    L = [str(i) for i in range (int("1"*n), int(12345679 * (10**(n-8))) + 1)]
reg = "1{1,4}(2{1,4}(3{1,4}(4{1,4}(5{1,4}(6{1,4}(7{1,4}(8{1,4}(9{1,4})?)?)?)?)?)?)?)?\Z"
return list(filter(re.compile(reg).match, L))

我认为我可以做得更好,因为这个很慢,并且如果从头开始读取它并不会删除那些与其他相同的那些(它将返回&#34; 112234&#34;和&#34; 123344&#34;,或&#34; 11112&#34;和&#34; 12222&#34;)

编辑:这样的条件会更快一点:

L = [str(i) for i in range (int("1"*n), int(12345679 * (10**(n-8))) + 1) if \
    i%10 >= (i//10)%10 and i%100 >= (i//10)%100 and i%1000 >= (i//10)%1000 and i%10000 >= (i//10)%10000]