将一个列表解压到 python 中另一个列表的索引

Unpack a List in to Indices of another list in python

是否可以解压缩数字列表以列出索引?例如,我有一个列表,列表中包含这样的数字:

a = [[25,26,1,2,23], [15,16,11,12,10]]

我需要将它们放在一个模式中,所以我做了这样的事情

newA = []

for lst in a:
    new_nums = [lst[4],lst[2],lst[3],lst[0],lst[1]]
    newA.append(new_nums)

print (newA) # prints -->[[23, 1, 2, 25, 26], [10, 11, 12, 15, 16]]

所以我没有写 new_nums = [lst[4],lst[2],lst[3],lst[0],lst[1]] ,而是想将模式定义为名为 pattern = [4,2,3,0,1] 的列表,然后将它们解压缩到 lst 的索引中以创建 [= 的新顺序15=].

有什么好的方法吗

如果您不反对使用 numpy,请尝试以下操作:

import numpy as np

pattern = [4, 2, 3, 0, 1]

newA = [list(np.array(lst)[pattern]) for lst in a]

希望对您有所帮助。

给定一个名为 pattern 的索引列表,您可以像这样使用 列表理解

new_lst = [[lst[i] for i in pattern] for lst in a]

在纯 Python 中,您可以使用列表理解:

pattern = [4,2,3,0,1]

newA = []

for lst in a:
    new_nums = [lst[i] for i in pattern]
    newA.append(new_nums)

在 numpy 中,您可以使用花哨的索引功能:

>>> [np.array(lst)[pattern].tolist() for lst in a]
[[23, 1, 2, 25, 26], [10, 11, 12, 15, 16]]

它比其他的慢,但它是另一种选择。您可以根据您的模式对列表进行排序

a = [[25,26,1,2,23], [15,16,11,12,10]]
pattern = [4,2,3,0,1]
[sorted(line,key=lambda x:pattern.index(line.index(x))) for line in a]
[[23, 1, 2, 25, 26], [10, 11, 12, 15, 16]]

operator.itemgetter提供了一个有用的映射函数:

from operator import itemgetter
a = [[25,26,1,2,23], [15,16,11,12,10]]
f = itemgetter(4,2,3,0,1)
print [f(x) for x in a]

[(23, 1, 2, 25, 26), (10, 11, 12, 15, 16)]

如果您想要列表列表而不是元组列表,请使用 list(f(x))