如何在Python中存储数字中的数字列表?

如何在Python中存储数字中的数字列表?,python,Python,我需要在只接受数字(int或floats)的列中保存一个由4个数字组成的元组 我有一个4个数字的列表,比如-0.0123445552,-29394.2393339,0.299393330.0000234556 如何将所有这些数字“存储”在一个数字中,并在Python中检索原始元组 谢谢我的想法很奇怪;但它会起作用吗 In [31]: nk="-0.0123445552, -29394.2393339, 0.299393333, 0.00002345556" In [32]: nk1="".jo

我需要在只接受数字(int或floats)的列中保存一个由4个数字组成的元组

我有一个4个数字的列表,比如-0.0123445552,-29394.2393339,0.299393330.0000234556

如何将所有这些数字“存储”在一个数字中,并在Python中检索原始元组


谢谢

我的想法很奇怪;但它会起作用吗

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处拆分它;它用于
空间


而且这根绳子很长;我们可以通过
math.log
将其压缩到一个小数字;当我们进入
Out[36]

时,如果您所说的
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)

这并不能真正回答您的问题,但您试图做的却违反了。更改DB模式以引入交集表真的不是一个选项吗?

您可以使用
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个浮点数打包成一个浮点数,您需要使用半浮点数,但这是一个问题:

对于半浮点数,到目前为止python中似乎没有本机支持:


但是,
numpy
模块确实支持半浮点数()。也许你可以用它将4个浮点数组合成一个浮点数

继续@YevgenYampolskiy的使用方法:

您可以使用numpy将数字转换为16位浮点,然后将数组视为一个64位整数:

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位浮点的版本。

在数字x=5x=(-0.0123445552,--29394.2393339,0.299393333,0.00002345556)中,这是您想要做的吗?我们需要有关“列”的更多信息。一个想法可能是将元组的浮点转换为二进制表示,将它们连接成一个大的二进制数,并将大的二进制数转换成整数。然后,为了解包,我们将整数转换成二进制数,将二进制数拆分成4个二进制数,并将它们转换成浮点数。它会工作吗?这不是python特有的。存储对存储实际值的k/v存储的引用。如何从最后一个存储中获取原始的
nk
?您将尝试以浮点形式存储“454846484950515252535350443245550575155752465051575151574432484575757515751514432484684848484850551553554”?它将溢出是的,它将溢出。!!!也许它可以通过转换到另一个基地来降低@YevgenYampolskiy:那么可以将这个长值作为
log
???见更新后的帖子<代码>输出[36]
???溢出。。。Oracle数字类型存储最多38个字符的整数,例如instance@YevgenYampolskiy:不,在最初的问题中,他们在哪里提到了数据库,在Python中,
int
的意思是无限的对问题的可怕评论是的,这会让一切变得更容易!但是我不能改变模式。我只能读和写行。非常感谢你。我为这个奇怪的问题感到抱歉!