【发布时间】:2011-05-17 13:11:41
【问题描述】:
考虑“字符串”(将其视为数字数组)
0 0 1 8 8 8 1 0
RLE(“groupby”)是:
[(0,2), (1, 1), (8,3), (1, 1), (0, 1)]
然后我们用前面元素的游程总和来丰富上述 RLE。
因此,上述内容的丰富版本变为:
[(0, (0,2)), (0+2, (1, 1)), (0+2+1, (8,3)), (0+1+2+3, (1, 1)), (0+1+2+3+1, (0, 1))]
“字符串”在 1 处拆分:
0 0 , 8 8 8 , 0
RLE 在 1 上拆分
[(0,2)] , [(8,3)] , [(0, 1)]
“字符串”在 8 上拆分:
0 0 1 , , , 1 0
RLE 在 8 上拆分
[(0,2), (1, 1)] , , , [(1, 1), (0, 1)]
注意:在我的示例中,我引用了“RLE 在 Z 上拆分”列表,但并未对其进行丰富。事实并非如此。我把它们排除在外以减少混乱。例如,“RLE split on 1”实际上应该被视为:
[(0, (0,2))] , [(0+2+1, (8,3))] , [(0+1+2+3+1, (0, 1)]
我怎样才能在 Z 上实现这种“RLE 拆分”(= 1, 8; 在这种情况下)
可以省略空数组(拆分后)。
也许是一个聪明的列表组合? (使用嵌套了 append 的 for 循环似乎更容易解决)
【问题讨论】:
-
我很困惑。像
0+2+1这样的表达式应该是一个字符串还是你只是想要3? -
只有 3 个 - 我想把事情分解成可读性。很抱歉造成混乱!
-
假设 RLE=[(0,2), (1,1), (8,3), (4,2), (1,1), (0,1)];结果应该是 [(0, (0,2))] , [(0+2+1, (8,3), (4,2) )] , [(0+2 +1+3+2+1, (0, 1)] 或 [(0, (0,2))] , [(0+2+1, (8,3)), (0+2 +1+3, (4,2)) ] , [(0+2+1+3+2+1, (0, 1)]
-
要获得该 RLE,原始数组需要为
a = [0, 0, 1, 8, 8, 8, 4, 4, 1, 1, 0]。在那种情况下,这就是我所拥有的get_rle(a) -> [[(0, (0, 2)), (2, (1, 1)), (3, (8, 3)), (6, (4, 2)), (8, (1, 2)), (10, (0, 1))]] get_rle(a, 1) -> [[(0, (0, 2))], [(3, (8, 3)), (6, (4, 2))], [(10, (0, 1))]] get_rle(a, 4) -> [[(0, (0, 2)), (2, (1, 1)), (3, (8, 3))], [(8, (1, 2)), (10, (0, 1))]] get_rle(a, 8) -> [[(0, (0, 2)), (2, (1, 1))], [(6, (4, 2)), (8, (1, 2)), (10, (0, 1))]] -
只是认为对一组使用相同的起始索引会减少嵌套,无论如何已经做到了。检查下面的答案或这个:inOneLine=lambda dat,n:[list(g) for k,g in itertools.groupby((zip((sum(tuple(zip(*((k,len(tuple(g))) ) for k,g in itertools.groupby(dat))))[1][:i]) for i in range(len(tuple(zip(*((k,len(tuple(g))) for k, g in itertools.groupby(dat))))[1]))) ,(zip(*tuple(zip(*((k,len(tuple(g)))) for k,g in itertools.groupby(dat) ))))))),lambda x:x[1][0]!=n) if k]
标签: python functional-programming list-comprehension arrays run-length-encoding