4

我有一个长长的列表,看起来像这样:

[True, True, True, False, ... ]

在瓷砖地图中表示墙壁。不能保证它是 4 的倍数,但它是否在最后被填充并不重要。

我想将其转换为十六进制字符串,因此对于上面的示例,它将以 E ...

我希望有一个很好的优雅方式来做到这一点(使用 Python 2.7.3)!

谢谢。

已编辑

这是 9x9 地图的示例:

map = [True, True, True, True,
       True, True, True, True, 
       True, True, True, True, 
       True, False, False, True, 
       True, True, True, True, 
       True, False, False, False, 
       False, True, True, True, 
       True, True, False, False, 
       False, False, True, True, 
       True, True, True, True, 
       False, False, True, True, 
       True, True, True, True, 
       True, True, True, True, 
       True, True, True, True, 
       True, True, True, True, 
       True, True, True, True, 
       True, True, True, True, 
       True, True, True, True, 
       True, True, True, True, 
       True, True, True, True, 
       True]# False, False, False padded

我想要的是能够

str = heximify(map)
print str
> FFF9F87C3F3FFFFFFFFF8
4

4 回答 4

7

加入单线俱乐部,通过位操作似乎更合适。

val = hex(reduce(lambda total, wall: total << 1 | wall, walls, 0))

这与以下内容相同:

val = 0
for wall in walls:
    val <<= 1 # add one 0 bit at the "end"
    val |= wall # set this bit to 1 if wall is True, otherwise leave it at 0

val = hex(val) # get a hex string in the end
val = format(val, 'x') # or without the leading 0x if it's undesired
于 2013-07-18T19:24:39.443 回答
4
>>> walls = [True, True, True, False]
>>> hex(int(''.join([str(int(b)) for b in walls]), 2))
'0xe'

或(受@millimoose 回答的启发),

>>> hex(sum(b<<i for i,b in enumerate(reversed(walls))))
'0xe'
于 2013-07-18T19:10:35.833 回答
2
walls = [True, True, True, False, ... ]
val = 0
for w in walls:
    val *= 16
    val += int(w)
val = hex(val) 

或肮脏的单线:

val = hex(sum(i*16**pow for i,pow in zip((int(w) for w in walls),range(len(walls))[::-1])))
于 2013-07-18T19:05:12.520 回答
0
>>> hex(int("".join(["%d"%s for s in [True,True,True,False]]),2))
'0xe'
于 2013-07-18T19:12:41.903 回答