Python3 - 长嵌套列表的无损压缩

时间:2016-03-30 16:57:55

标签: algorithm list python-3.x compression

我正在编写一种压缩算法来减少组合输出的大小,这是许多输入状态的排列。修改格式不是一种选择。

目标是保留有关产生特定输出的输入组合的信息,因此如果不影响输出,则可以对各个输入状态进行标记化,条件是所有其他输入状态。

我有两个列表列表,

inputs = [                       |   outputs = [
             [1,0,0.5,"foo"],    |                 [-0.25,"cold"],    
             [0,1,-0.5,"poo"],   |                 [0.66,"hot"],
                   .             |                       .
                   .             |                       .
                   .             |                       .
         ]                       |             ]

属性:

  • 输入和输出列表的长度相同,而且很长,所以内存是一个问题

  • 已与索引配对

  • 子列表在输入和输出列表中的长度和类型都很短且内部一致

  • 子列表由异类型组成,但如果需要,我可以将它们全部转换为字符串

我会将它们传递给像这样的哈希函数:

list(map(lambda results: hashfunction(results[0],results[1]), list(zip(inputs,outputs))))

据我所知,这是一种内存有效的迭代方法,但在我这样做之前,我想尽可能减少它们的长度。

由于子列表内部一致,我知道一些索引是布尔值,对于相等的输出子列表,我可以减少这样的输入子列表,而不会丢失信息:

inputs = [... ,[1,0,0.5,1],[0,0,0.5,1], ...]
outputs = [... ,[0.3,"warm"],[0.3,"warm"], ...]

在原地进行标记:

inputs = [... ,["don't care",0,0.5,1], ...]
outputs = [... ,[0.3,"warm"], ...]

输入和输出的长度减少1。

此外,我想压缩更高的基数输入列,例如,如果我知道任何输入子列表中的索引2仅采用值[-0.5,0,0.5],如果我找到此模式:

inputs = [... ,["don't care",0,-0.5,1],["don't care",0,0,1],["don't care",0,0.5,1], ...]
outputs = [... ,[0.1,"cake"],[0.1,"cake"],[0.1,"cake"], ...]

我想同样减少它们:

inputs = [... ,["don't care",0,"don't care",1], ...]
outputs = [... ,[0.1,"cake"], ...]

不幸的是,模式可能不相邻,所以我采用大量的排序和重新排序来查找可简化的模式,而且我不仅无法压缩结果集,运行时/内存也无法维持。< / p>

任何建议都非常感谢。

由于

1 个答案:

答案 0 :(得分:0)

我看着这个并思考,“map-reduce”。

具体而言,您希望将每个索引映射到作为输出的键,以及作为输入的值。对于每个可能的输出,您希望查看所有可能的输入值并对其执行一系列操作以压缩输入的表达式。但是,您可以一次在一个输出上执行此操作。

如果内存不是问题,您只需将键/值对存储在其键为输出的字典中。并遍历字典。

如果内存是一个挑战,您可以使用output, input格式将数据写入文件,使用外部sort实用程序对其进行排序,然后对其进行处理。 (请注意,Unix排序需要一点点哄骗才能进行asciibetical排序,你真的需要它来完成它。)当你处理该文件时,你应该有一个迭代器,一次读取一行,并产生一个输出到那里的所有投入。该迭代器将由一个函数处理,该函数会破坏该数据并输出您的压缩输入/输出规则。