我正在寻找一种清醒的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}进行互换}}
答案 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]]