2014-02-27 73 views
-1

我在寻找清醒的Python的方式按照“指数词典”列表中的交换项目:位排列索引字典

input = [[0 1 0 0],[0 1 0 1],[1 1 0 1],[0 0 0 1]] 

应导致:

output = [[0 0 1 0],[1 1 1 0],[0 1 0 0],[0 1 1 1]] 

根据以下比特置换:

pos_old | 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 
pos_new | 00 04 08 12 01 05 09 13 02 06 10 14 03 07 11 15 

input的索引04上的位是0,因此应根据pos_new与位于索引01的位1进行互换。

+0

等都不是代码写作服务。你有没有试图自己做这个? – martineau

回答

1

有几种方法可以做到这一点。一种是使用嵌套list comprehensions(以及一些指数算术):

permutation = [[0, 4, 8, 12], [1, 5, 9, 13], [2, 6, 10, 14], [3, 7, 11, 15]] 

def permute(bits): 
    return [[bits[i/4][i%4] for i in chunk] for chunk in permutation] 

这将通过建立位逐块地,你的位输出块,根据置换给定的索引获取正确的值。 input[i/4][i%4]确实查找,i/4其中(在Python 3:i//4代替,因为我们需要整数除法)选择正确的输入块和i%4选择从该输入块右边项(%是在python的modulo操作者)。

让我们来看看它是否有效,而不是只与位,太:

>>> permute([[0, 1, 0, 0],[0, 1, 0, 1],[1, 1, 0, 1],[0, 0, 0, 1]]) % your example 
[[0, 0, 1, 0], [1, 1, 1, 0], [0, 0, 0, 0], [0, 1, 1, 1]] 

>>> permute([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15]]) 
[[0, 4, 8, 12], [1, 5, 9, 13], [2, 6, 10, 14], [3, 7, 11, 15]] 

>>> permute([[0, 2, 4, 6], [8, 10, 12, 14], [16, 18, 20, 22], [24, 26, 28, 30]]) 
[[0, 8, 16, 24], [2, 10, 18, 26], [4, 12, 20, 28], [6, 14, 22, 30]]