优雅的方式将列表转换为十六进制字符串

Mal*_*ats 4 python

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

[True, True, True, False, ... ]
Run Code Online (Sandbox Code Playgroud)

代表瓷砖地图中的墙.它不能保证是4长的倍数,但如果在最后填充则无关紧要.

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

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

谢谢.

EDITED

这是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
Run Code Online (Sandbox Code Playgroud)

我想要的是能够做到的

str = heximify(map)
print str
> FFF9F87C3F3FFFFFFFFF8
Run Code Online (Sandbox Code Playgroud)

mil*_*ose 7

加入单线俱乐部,通过比特操纵似乎更合适.

val = hex(reduce(lambda total, wall: total << 1 | wall, walls, 0))
Run Code Online (Sandbox Code Playgroud)

这与以下相同:

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
Run Code Online (Sandbox Code Playgroud)