猿问

对于二进制分离,哪个更好:使用列表还是 divmod?

我正在尝试将二进制字符串从末尾除以恒定长度:例如,'1001011000'除以 3-> ['1','001','011','000']。从数字 600 开始,


def bin_divby(dec,leng):

    n = 0

    mid_res = ''

    res=list()

    for nums in bin(dec)[2:][::-1]:

        n+=1

        mid_res+=nums

        if not n%leng:

            res+=[mid_res[::-1]]

            mid_res=''

    if n%leng:

        res+=[mid_res[::-1]]

    return res[::-1]

(我不确定,但代码有点像这样)使用带有少量变量的 for 循环会使其工作,但我很好奇使用 divmod 是否会使其更快。或者基础转换会更好吗?我认为使用二进制形式比通过 divmod 再次重新计算更有效,但正如您所见,我也使用了很多变量和函数。对于重复数千次计算,哪个更好?


尚方宝剑之说
浏览 145回答 1
1回答

阿晨1998

我们可以为此使用列表理解:def bin_divby(dec, leng):    bn = bin(dec)[:1:-1]    return [bn[i:i+leng][::-1] for i in range(0, len(bn), leng)][::-1]我们可以通过反转range(..)对象来稍微提高效率:def bin_divby(dec, leng):    bn = bin(dec)[:1:-1]    n = len(bn) - 1    return [bn[i:i+leng][::-1] for i in range(n - n%leng, -leng, -leng)]所以这里我们首先反向获取二进制字符串,然后我们迭代该字符串,并且每次对字符串进行切片。最终的结果是相反的。这产生了预期的:>>> bin_divby(0b1001011000, 1)['1', '0', '0', '1', '0', '1', '1', '0', '0', '0']>>> bin_divby(0b1001011000, 2)['10', '01', '01', '10', '00']>>> bin_divby(0b1001011000, 3)['1', '001', '011', '000']>>> bin_divby(0b1001011000, 4)['10', '0101', '1000']>>> bin_divby(0b1001011000, 5)['10010', '11000']>>> bin_divby(0b1001011000, 6)['1001', '011000']>>> bin_divby(0b1001011000, 7)['100', '1011000']
随时随地看视频慕课网APP

相关分类

Python
我要回答