web-dev-qa-db-ja.com

intを16進数の文字列にフォーマットします

ランダムな整数のリスト(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])

ただし、これは少し厄介に見えます。もっと簡単な方法はありますか?

45
facha
''.join('%02x'%i for i in input)
50
vartec

完全を期すために、最新の.format()構文を使用します。

>>> numbers = [1, 15, 255]
>>> ''.join('{:02X}'.format(a) for a in numbers)
'010FFF'
108
gak
>>> str(bytearray([0,1,2,3,127,200,255])).encode('hex')
'000102037fc8ff'
31
John La Rooy

さらに別のオプションは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呼び出しによって作成されたコピーを保存します。

16
Sven Marnach

私の他の答えと同様ですが、フォーマット文字列を繰り返します。

>>> numbers = [1, 15, 255]
>>> fmt = '{:02X}' * len(numbers)
>>> fmt.format(*numbers)
'010FFF'
11
gak
a = [0,1,2,3,127,200,255]
print str.join("", ("%02x" % i for i in a))

プリント

000102037fc8ff

(10から15の範囲の整数ではコードが失敗することにも注意してください。)

3
Sven Marnach

最も最近の私の意見では好ましいアプローチ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}'を比較します。
2
Roelant

python 2.Xでは、次のことができます。

numbers = [0, 1, 2, 3, 127, 200, 255]
print "".join(chr(i).encode('hex') for i in numbers)

印刷する

'000102037fc8ff'
0
selfboot