现有数万个包含压缩数据字典的顺序一维列表,宽高固定:
格式如下:
[
{'data1': 'a', 'rle': 1}, {'data3': 'b', 'rle': 3},
{'data1': 'a', 'rle': 2}, {'data3': 'c', 'rle': 2},
{'data3': 'c', 'rle': 3}, {'data2': 'b', 'rle': 1},
]
rle对应的即为压缩数据,意思是有多少个相同数据。但其现在是横向(或纵向)压缩,我想反过来,变成纵向(或横向)压缩。
我写了下面的代码:
def matrix():
import numpy as np
from collections import deque
tiles_list = [
{'data1': 'a', 'rle': 1}, {'data3': 'b', 'rle': 3},
{'data1': 'a', 'rle': 2}, {'data3': 'c', 'rle': 2},
{'data3': 'c', 'rle': 3}, {'data2': 'b', 'rle': 1},
]
height, width = 4, 3
data = deque()
tile_count = 0 # 计算所有方块是否够一列
temp_list = deque()
for tile_dict in tiles_list:
count = tile_dict.pop('rle')
tile_count += count # 计算所有方块是否够一列
temp_list.extend([tile_dict]*count)
if tile_count == height:
data.append(temp_list)
tile_count = 0
temp_list = deque()
transpose_list = np.array(data).transpose()
final = []
for i in transpose_list:
final.append([(k, len(list(v))) for k, v in itertools.groupby(i)])
return final
得到结果如下:
[({'data1': 'a'}, 2), ({'data3': 'c'}, 1)]
[({'data3': 'b'}, 1), ({'data1': 'a'}, 1), ({'data3': 'c'}, 1)]
[({'data3': 'b'}, 1), ({'data3': 'c'}, 2)]
[({'data3': 'b'}, 1), ({'data3': 'c'}, 1), ({'data2': 'b'}, 1)]
但数据量大的时候(上万乃至十万)运行效率非常低,占用内存也很多。
有没有改进建议??最好是关于numpy的运用,个人不是特别了解