寻找最 Pythonic 的方法来将布尔值列表更改为整数,将它们转换为以 2 为基数的数字,但我也有一些额外的逻辑

问题描述 投票:0回答:1

所以我正在为视频游戏开发一种自定义平铺方法。我将本地图块类型的数据存储为列表,其中 True 表示相同类型,False 表示不同类型,图块的布局如下:

| 7 | 0 | 1 |
-------------
| 6 |   | 2 |
-------------
| 5 | 4 | 3 |

现在有一些(确切地说是 48 个)不同的图块表示形式,但是当我将布尔列表转换为二进制时,我得到了 (0,255) 中的数字。显然列表中存在重复项,因此以下是删除这些重复项的方法。偶数是基本方向,它们总是代表自己,但是奇数只有在两个相邻的基本方向都被占用时才应该填充(真)。

| T | T | F |
-------------
| F |   | T |
-------------
| T | F | T |

output should be => [T,F,T,X,F,X,F,X] => 10100000 => 160

X 可以是任何东西,我可能会选择 0。

所以这就是我尝试过的:

#inputs
i,j = 1,1
pixels = [[True,False,True],[True,True,False],[False,True,True]]

#inside a function
binary_list = []
for x in [1,-1]:
    binary_list.append(pixels[i+0][i-x])
    for y in [-x,0,x]:
        binary_list.append(pixels[i+x][i+y]
binary_list.append(binary_list[-1])
str_bits = ""
for i in range(8):
    if not i % 2:
        str_bits = str_bits + str(int(binary_list[i]))
    elif binary_list[i-1] and binary_list[i+1]:
        str_bits = str_bits + str(int(binary_list[i]))
    else:
        str_bits = str_bits + "0"
#return value just return the int but for visibility now...
print(str_bits, int(str_bits, base=2))

所以实际上,我将使用 type_check 而不是像素列表引用,是的,它可以工作,但我怎样才能做得更好/更Python化?

python optimization binary
1个回答
0
投票

当您使用数字时,最好使用整数,而不是构建字符串并在最后进行转换。简单的位移位与将数字附加到字符串具有相同的作用。

bin_bits = 0
for i in range(8):
    bin_bits <<= 1
    if not i % 2:
        bin_bits += binary_list[i]
    elif binary_list[i-1] and binary_list[i+1]:
        bin_bits += binary_list[i]
    else:
        pass # no need to append zeros
© www.soinside.com 2019 - 2024. All rights reserved.