我有一个包含两个元素的数组:第一个是类型,第二个是我需要转换的数据数组。
[['string','int32','string','int64','float32','string','string'],['any string','19','any string','198732132451654654','0.6','any string','any string']]
我知道如何将整数转换为二进制,但是在上面具有多种类型的数组中,如何将其转换为二进制?
我有一个包含两个元素的数组:第一个是类型,第二个是我需要转换的数据数组。
[['string','int32','string','int64','float32','string','string'],['any string','19','any string','198732132451654654','0.6','any string','any string']]
我知道如何将整数转换为二进制,但是在上面具有多种类型的数组中,如何将其转换为二进制?
这是一个很好的方法:
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
,然后使用第二个列表中的相应数据项调用它。可以for
通过使用称为列表推导的东西在列表声明中使用循环来创建列表。该zip
函数在这里用于为循环的每次迭代从每个子列表创建值对。
我不确定这是否正是您想要的,但我认为这就是您要寻找的:
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]))]
尽管您已经接受了我的其他答案,但在注意到您的评论解释说您真正想要的是使用 将数据转换为二进制文件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 二进制值——我认为这就是您所寻求的。