ランダムな整数のリスト(0〜255)から16進数の文字列を作成する必要があります。各16進数字は、5-"05"、16-"10"などの2文字で表す必要があります。
例:
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])
ただし、これは少し厄介に見えます。もっと簡単な方法はありますか?
''.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の範囲の整数ではコードが失敗することにも注意してください。)
最も最近の私の意見では好ましいアプローチはf-string
です:
''.join(f'{i:02x}' for i in [1, 15, 255])
古い形式スタイルは%
- syntaxでした:
['%02x'%i for i in [1, 15, 255]]
より現代的なアプローチは.format
メソッドです:
['{:02x}'.format(i) for i in [1, 15, 255]]
最近では、python 3.6以降、f-string
構文 に処理されました:
[f'{i:02x}' for i in [1, 15, 255]]
f'{i:02x}'
は次のように機能することに注意してください。
:
の前の最初の部分は、フォーマットする入力または変数です。x
は、文字列がhexであることを示します。 f'{100:02x}'
とf'{100:02d}'
を比較します。02
は、0
の長さ2
で文字列を左詰めする必要があることを示します。 f'{100:02x}'
とf'{100:30x}'
を比較します。python 2.Xでは、次のことができます。
numbers = [0, 1, 2, 3, 127, 200, 255]
print "".join(chr(i).encode('hex') for i in numbers)
印刷する
'000102037fc8ff'