我有一个很长的列表,如下所示:
[True, True, True, False, ... ]
在瓷砖地图中表示墙。它不能保证是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
我想要的是能够
str = heximify(map)
print str
> FFF9F87C3F3FFFFFFFFF8
答案 0 :(得分: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
答案 1 :(得分: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'
答案 2 :(得分: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])))
答案 3 :(得分:0)
>>> hex(int("".join(["%d"%s for s in [True,True,True,False]]),2))
'0xe'