2011-04-14 13 views
28

Potrzebuję utworzyć ciąg cyfr szesnastkowych z listy losowych liczb całkowitych (0-255). Każda cyfra hex powinien być reprezentowany przez dwa znaki: 5 - "05", 16 - "10", itpFormat ints na ciąg heksadecymalny

Przykład:

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

udało mi się wymyślić:

#!/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]) 

To jednak wygląda trochę niezręcznie. Czy jest prostszy sposób?

Odpowiedz

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

drukuje

000102037fc8ff 

(również pamiętać, że kod nie powiedzie się do liczb całkowitych w zakresie od 10 do 15.)

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

+1 dla wersji bez formatowania% voodoo –

10

Jeszcze innym rozwiązaniem jest binascii.hexlify:

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

drukuje

000102037fc8ff 

to też najszybsza wersja dla dużych ciągów na moim komputerze.

W Pythonie 2.7 lub wyżej, to można poprawić jeszcze bardziej za pomocą

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

zapisywania kopii utworzonej przez wywołanie bytes.

65

Tylko dla kompletności, stosując nowoczesne .format() składnię:

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

Podobny do innych moją odpowiedź, z wyjątkiem powtarzania ciąg formatu:

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