索引字典的比特排列

时间:2014-02-27 23:02:40

标签: python list permutation

我正在寻找一种清醒的pythonic方式来根据“索引词典”交换列表中的项目:

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

示例04的索引input上的位是0,因此应根据pos_new使用索引01处的位{{1}进行互换}}

1 个答案:

答案 0 :(得分: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从中选择正确的项目input chunk(%是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]]