2013-07-18 2 views
4

У меня есть длинный список, который выглядит следующим образом:Элегантный способ преобразовать список в шестнадцатеричную строку

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

Представительство стены в карте плитки. Он не гарантированно будет кратным 4 долгим, но не имеет значения, будет ли он дополняться в конце.

Я хотел бы, чтобы преобразовать это в шестнадцатеричной строки, так что для приведенного выше примера было бы начать с E ...

Я надеялся, что там был хороший элегантный способ сделать это (с использованием Python 2.7. 3)!

Спасибо.

EDITED

Это пример карты 9х9:

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

Я думаю, что вы имеете в виду байт строки, не так ли? – Keith

+0

Нет, на самом деле я хочу, чтобы строка была в конце, что-то вроде eff5ac5664abe – MalphasWats

+0

Где вы хотите заполнить (если длина не кратная 4)? И как именно вы хотите, чтобы он дополнялся? Или, по-другому, можете ли вы показать пример желаемого вывода для входной длины, скажем, 5? –

ответ

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 
+0

Я думаю, что, возможно, я был глуп или ошибался, 'print val' в конце этого дает мне« 0x1 »? – MalphasWats

+0

@arshajii 'tile' был опечаткой, это должно было быть« стена ». Я отредактировал ответ, чтобы исправить это. –

+0

@arshajii Извините, я использовал 'tile' и' tiles' в моем коде, а затем пропустил это при сопоставлении с именами OP. Спасибо Jon-Eric за исправление. – millimoose

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]))) 
+0

Мне понравился этот вид (верхняя часть), но val заканчивается как 0x1110, а не E – MalphasWats

+0

@MalphasWats: Я не могу отлаживать многое без примера для продолжения. Или, возможно, я неправильно понял ваш вопрос. – inspectorG4dget

+0

Я обновил свой вопрос, извините. – MalphasWats

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' 
0
>>> hex(int("".join(["%d"%s for s in [True,True,True,False]]),2)) 
'0xe' 
Смежные вопросы