将零添加到列表中

Prepending zeros to a list

故事如下。用户输入一个数字。 Python把字符串转成int,用算法做成二进制数。例如:

firstdecimal=input("Please enter your first denary number: ")

> 45

StrToInt = int(firstdecimal)
InputInt = ToBin(StrToInt)     # a working binary conversion function
print(InputInt)

> [1, 0, 1, 1, 0, 1]

我需要的是函数 Addzero(x) 能够获取二进制数列表 (InputInt),并在开头添加 0s。如果列表中已经有 8 个元素,则不需要添加 0.

def Addzero(value):
    reverse = value[::-1] 
    if len(value) != 8:
        value.extend([0])
        if len(value) == 8:
            reverse = value[::-1]
    elif len(value) == 8:
        return

我找不到让我将元素添加到开头的代码,所以我只是实现了一个反向功能来绕过它。

当我打印这个函数的内容时,我得到...

> None

这显然不是预期的结果。我需要输出。 (由 01 组成的完整 8 元素列表)

像这样:

> [0, 0, 1, 0, 1, 1, 0, 1]

这可能有用吗?我自己没有测试过,不过我觉得应该没问题。

def add_zero(binary_list):
    if len(binary_list) < 8:
        zeros = [0] * (8 - len(binary_list))
        return zeros + binary_list
    else:
        return binary_list

它 returns None 的原因仅仅是因为您的 return 语句缺少表达式:

elif len(value) == 8:
    return

因此 return 简单的意思是:“我们完成了,停止执行这个函数,什么都不应该 returned”。

而且并非所有代码路径都会执行 return 语句。最后,您的 AddZero 似乎只添加了一个 单个 零,这可能效率低下。

更好的解决方案可能是:

def Addzero(value):
    return [0] * max(0,8-len(value)) + value

此处的表达式 [0]*n 表示您在列表中重复 0 n 次。所以 [0]*4 将导致 [0,0,0,0]。现在我们需要添加的次数是 max(0,8-len(value))max(0,...) 实际上甚至不是必需的,因此您可以将其重写为:

def Addzero(value):
    return [0] * (8-len(value)) + value

这意味着我们必须缩短生成八项列表的元素数被构造为零列表。然后我们添加(附加)+ 原始列表。

如@Later42 在 中所示,您可以通过先进行 len 检查来提高效率,如果它等于 8,则 return 列表本身:

def Addzero(value):
    if(len(value) > 8) :
        return value
    else :
        return [0] * (8-len(value)) + value

Demo 使用 Python 的交互 shell:

$ python
Python 2.7.9 (default, Apr  2 2015, 15:33:21) 
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> def Addzero(value):
...     return [0] * (8-len(value)) + value
... 
>>> Addzero([1, 0, 1, 1, 0, 1])
[0, 0, 1, 0, 1, 1, 0, 1]

其他解决方案符合我的要求,但为什么不直接使用:

firstdecimal = input("Please enter your first denary number: ")

> 45

binaryStr = '{0:08b}'.format(firstdecimal)  # string, not a list

print(binaryStr)
> '00101101'

print(list(map(int, binaryStr))  # gives you the list
> [0, 0, 1, 0, 1, 1, 0, 1]

请注意,格式字符串中的 08b 表示参数 firstdecimal 将被转换为零填充的 8 长度二进制字符串。