2

2つの要素を持つ配列があります。1つは型、2つ目は変換する必要のあるデータ配列です。

[['string','int32','string','int64','float32','string','string'],['any string','19','any string','198732132451654654','0.6','any string','any string']]

整数をバイナリに変換する方法を知っていますが、上記の複数のタイプの配列で、どのようにバイナリに変換しますか?

4

3 に答える 3

2

これを行う良い方法は次のとおりです。

data = [['string','int32','string','int64','float32','string','string'],
        ['any string','19','any string','198732132451654654','0.6',
         'any string','any string']]

type_map = {'string': str, 'int32': int, 'int64': long, 'float32': float}
results = [type_map[t](d) for t, d in zip(data[0], data[1])]
print results

結果:

['any string', 19, 'any string', 198732132451654654L, 0.6, 'any string', 'any string']

これは、最初のリストの各項目のキーとして型文字列を使用して辞書で変換関数を検索することによって結果リストを作成しtype_map、2 番目のリストの対応するデータ項目でそれを呼び出します。リストは、リスト内包for表記と呼ばれるものを使用して、リスト宣言でループ権を使用して作成できます。この関数は、ループの反復ごとに各サブリストから値のペアを作成するためにここで使用されます。zip

于 2012-08-16T04:16:12.423 に答える
0

これがまさにあなたが望むものかどうかはわかりませんが、これがあなたが探しているものだと思います:

casts = { 'string': lambda x: str(x), \
    'int32': lambda x: int(x), \
    'int64': lambda x: int(x), \
    'float32': lambda x: float(x) }

types_to_cast = [['string','int32','string','int64','float32','string','string'],['any string','19','any string','198732132451654654','0.6','any string','any string']]

print [casts[types_to_cast[0][i]](types_to_cast[1][i]) for i in range(len(types_to_cast[0]))]
于 2012-08-16T03:03:10.277 に答える
0

あなたは私の他の答えを受け入れましたが、あなたが本当に望んでいたのは を使用してデータをバイナリに変換することであると説明したコメントに気づいた後struct.pack()、私はあなたにもっと適した別の答えを書きました(長くて少し複雑ですが)。

import struct

class TypeConv(object):
    BSA = '='  # native Byte order, standard Size, with no Alignment
    def __init__(self, conv_func, fmt_chr):
        self.__dict__.update(conv_func=conv_func, fmt_chr=fmt_chr)

    def pack(self, data):
        py_value = self.conv_func(data)
        count = str(len(py_value)) if self.conv_func is str else ''
        return struct.pack(self.BSA+count+self.fmt_chr, py_value)

type_conv = {'string': TypeConv(str, 's'),
             'int32': TypeConv(int, 'i'),
             'int64': TypeConv(long, 'q'),
             'float32': TypeConv(float, 'f'),
            }

array = [['string', 'int32', 'string', 'int64', 'float32', 'string', 'string'],
         ['any string', '19', 'any string', '198732132451654654',
          '0.6', 'any string', 'any string']]

binary_values = [type_conv[type_id].pack(data)
                     for type_id, data in zip(array[0], array[1])
                         if type_id in type_conv]  # to skip any unknown type_ids
print binary_values

出力:

['any string', '\x13\x00\x00\x00', 'any string', '\xfe\x9b<P\xd2\t\xc2\x02',
 '\x9a\x99\x19?', 'any string', 'any string']

このTypeConv.pack()メソッドは、最初に文字列値を同等の Python 値に変換しpy_value、次にそれを使用struct.pack()して C バイナリ値に変換します。これがあなたが求めているものだと思います。

于 2012-08-16T17:00:19.677 に答える