我需要在只接受数字(int或浮点数)的列中保存4个数字的元组
我有一个4号的列表,如-0.0123445552,-29394.2393339,0.299393333,0.00002345556。
如何在数字中“存储”所有这些数字,并能够在Python中检索原始元组?
由于
答案 0 :(得分:3)
跟进@ YevgenYampolskiy使用numpy的想法:
你可以使用numpy将数字转换为16位浮点数,然后将数组视为一个64位int:
import numpy as np
data = np.array((-0.0123445552, -29394.2393339, 0.299393333, 0.00002345556))
stored_int = data.astype('float16').view('int64')[0]
print(stored_int)
# 110959187158999634
recovered = np.array([stored_int], dtype='int64').view('float16')
print(recovered)
# [ -1.23443604e-02 -2.93920000e+04 2.99316406e-01 2.34842300e-05]
注意:这需要numpy 1.6或更高版本,因为这是第一个支持16位浮点数的版本。
答案 1 :(得分:2)
如果int
表示Python中的数据类型为int(从当前版本开始是无限制的),则可以使用以下解决方案
>>> x
(-0.0123445552, -29394.2393339, 0.299393333, 2.345556e-05)
>>> def encode(data):
sz_data = str(data)
import base64
b64_data = base64.b16encode(sz_data)
int_data = int(b64_data, 16)
return int_data
>>> encode(x)
7475673073900173755504583442986834619410853148159171975880377161427327210207077083318036472388282266880288275998775936614297529315947984169L
>>> def decode(data):
int_data = data
import base64
hex_data = hex(int_data)[2:].upper()
if hex_data[-1] == 'L':
hex_data = hex_data[:-1]
b64_data = base64.b16decode(hex_data)
import ast
sz_data = ast.literal_eval(b64_data)
return sz_data
>>> decode(encode(x))
(-0.0123445552, -29394.2393339, 0.299393333, 2.345556e-05)
答案 2 :(得分:1)
您可以使用struct
模块将4个整数组合成一个整数,或者将两个浮点组合成一个双精度:
from struct import *
s = pack('hhhh', 1, -2, 3,-4)
i = unpack('Q', pack('Q', i[0]))
print i
print unpack('hhhh', s)
s = pack('ff', 1.12, -2.32)
f = unpack('d', s)
print f
print unpack('ff', pack('d', f[0]))
打印
(18445618190982447105L,)
(1, -2, 3, -4)
(-5.119999879002571,)
(1.1200000047683716, -2.319999933242798)
基本上在这个例子中,元组(1,-2,3,-4)被打包成一个整数18445618190982447105,而元组(1.12,-2.32)被打包成-5.119999879002571
要将4个浮点数装入单个浮点数,您需要使用半浮点数,但这是一个问题:
使用half-float,看起来截至目前python中没有本机支持: http://bugs.python.org/issue11734
但是numpy
模块确实支持半浮动(http://docs.scipy.org/doc/numpy/user/basics.types.html)。也许你可以用它以某种方式将4个花车包装成一个浮子
答案 3 :(得分:0)
In [31]: nk="-0.0123445552, -29394.2393339, 0.299393333, 0.00002345556"
In [32]: nk1="".join(str(ord(x)) for x in nk)
In [33]: nk1
Out[33]: '454846484950515252535353504432455057515752465051575151515744324846505757515751515151443248464848484850515253535354'
In [34]: import math
In [35]: math.log(long(nk1), 1000)
Out[36]: 37.885954947611985
In [37]: math.pow(1000,_)
Out[37]: 4.548464849505043e+113
您可以轻松解压缩此字符串(Out[33]
);例如,将其拆分为32
;它为space
。
这个字符串也很长;我们可以通过math.log
将其设为少数;正如我们进入Out[36]
。
答案 4 :(得分:0)
这并不能真正回答您的问题,但您尝试做的事情违反了1NF。是否更改数据库架构以引入交集表真的不是一个选项?