在python中生成特殊元素列表的另一种方式


listA = ['000','001','010','011', '100','101','111','110']
为了得到上面的列表,我通常使用下面的代码。我的目标是得到3个数字的所有可能组合,其中每个数字可以是01
listA = list(range(0,222))
listA = [str(x).zfill(3) for x in listA]
 listA = [x for x in listA if not x[-3] in [str(z) for z in range(2,10,1)]]
 listA = [x for x in listA if not x[-2] in [str(z) for z in range(2,10,1)]]
 listA = [x for x in listA if not x[-1] in [str(z) for z in range(2,10,1)]]

这只适用于list(range(0,222))相对较小的情况,对于(0,222222222222)这样的大范围,listA = list(range(0,222222222222))返回Memory error。还有别的办法吗?

您可以尝试使用itertools.product:

>>> from itertools import product
>>> a = [''.join(p) for p in product('01', repeat=3)]
>>> a
['000', '001', '010', '011', '100', '101', '110', '111']

这不是二进制字符串从0到一些结束数?

你可以这样做:

def zn1(up):
    w=len(f'{up:b}')
    return [f'{x:0{w}b}' for x in range(up+1)]

或者,如果内存有问题,使用生成器:

def zn1(up):
    w=len(f'{up:b}')
    for n in range(up+1):
        yield f'{x:0{w}b}'

第一个例子:

>>> zn1(7)
['000', '001', '010', '011', '100', '101', '110', '111']
>>> zn1(2000)
['00000000000', '00000000001', '00000000010', '00000000011', '00000000100', 
...
'11111001100', '11111001101', '11111001110', '11111001111', '11111010000']

最新更新