在Python中将一个列表拆分为另一个列表的索引

7

能否将数字列表展开为列表索引?例如,我有一个包含数字的列表:

``` [[1, 2, 3], [4, 5, 6]] ```

我想将其转换为以下格式:

``` [[1, 4], [2, 5], [3, 6]] ```
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中,以创建lst的新顺序。

有没有更好的方法实现呢?


@sapensadler 我的目标不是创建一个平面列表,而是保留列表的结构,并通过传递自定义数字列表来改变索引的顺序。 - Watarap
5个回答

7

如果给出一个叫做pattern的指数列表,你可以使用如下的列表推导式

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

3

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))


2

如果你不反对使用numpy,可以尝试以下代码:

import numpy as np

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

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

希望这有所帮助。

2

在纯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中,您可以使用高级索引(fancy indexing)功能:
>>> [np.array(lst)[pattern].tolist() for lst in a]
[[23, 1, 2, 25, 26], [10, 11, 12, 15, 16]]

0

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

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]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接