Форматирование ints в строку hex

Мне нужно создать строку шестнадцатеричных цифр из списка случайных чисел (0-255). Каждая шестнадцатеричная цифра должна быть представлена ​​двумя символами: 5 - "05", 16 - "10" и т.д.

Пример:

Input: [0,1,2,3,127,200,255], 
Output: 000102037fc8ff

Мне удалось найти:

#!/usr/bin/env python
def format_me(nums):
 result = ""
 for i in nums:
 if i <= 9:
 result += "0%x" % i
 else:
 result += "%x" % i
 return result
print format_me([0,1,2,3,127,200,255])

Однако это выглядит немного неудобно. Есть ли более простой способ?

6 ответов

''.join('%02x'%i for i in input)


Просто для полноты, используя современный синтаксис .format():

>>> numbers = [1, 15, 255]
>>> ''.join('{:02X}'.format(a) for a in numbers)
'010FFF'


>>> str(bytearray([0,1,2,3,127,200,255])).encode('hex')
'000102037fc8ff'


Еще один вариант: binascii.hexlify:

a = [0,1,2,3,127,200,255]
print binascii.hexlify(bytes(bytearray(a)))

печатает

000102037fc8ff

Это также самая быстрая версия для больших строк на моей машине.

В Python 2.7 или выше вы можете улучшить это еще больше, используя

binascii.hexlify(memoryview(bytearray(a)))

сохранение копии, созданной вызовом bytes.


Как и в моем другом ответе, кроме повторения строки формата:

>>> numbers = [1, 15, 255]
>>> fmt = '{:02X}' * len(numbers)
>>> fmt.format(*numbers)
'010FFF'


a = [0,1,2,3,127,200,255]
print str.join("", ("%02x" % i for i in a))

печатает

000102037fc8ff

(Также обратите внимание, что ваш код будет сбой для целых чисел в диапазоне от 10 до 15.)

licensed under cc by-sa 3.0 with attribution.