根据给定的索引交换两个列表的值

3

我有一个列表,其中包含两个numpy数组,第一个数组表示值的索引,第二个数组包含相应的值。它看起来有点像这样:

x_glob = [[0, 2], [85, 30]]

现在有一个函数接收以下输入:

x = [-10, 0, 77, 54]

我的目标是根据给定的x_glob索引数组,将x的值与x_glob的值互换。这个例子应该会得到这样的结果:

x_new = [85, 0, 30, 54]

我有一个使用循环的解决方案。但我相信在Python中有一种更高效和优雅的方法来解决这个问题。

谢谢!


你的循环解决方案是什么样子? - tobias_k
3个回答

3
< p > NumPy数组可以使用其他数组进行索引,因此替换变得非常简单。

您只需要使用x_glob [0]索引第二个数组,然后赋值x_glob [1]

x[x_glob[0]] = x_glob[1]

要了解这是如何工作的,只需查看索引的结果:

>>> x[x_glob[0]]
array([-10,  77])

结果是一个包含需要替换的两个值的数组,我们用另一个numpy数组x_glob[1]来替换它们,以达到所需的结果。


>>> x_glob = np.array([[0, 2], [85, 30]])
>>> x = np.array([-10, 0, 77, 54])
>>> x[x_glob[0]] = x_glob[1]
>>> x
array([85,  0, 30, 54])

2

如果不使用 numpy,你可以创建一个 dict,将从 x_glob 中得到的索引映射到相应的值,然后使用该字典的 get 方法进行列表推导:

>>> x_glob = [[0, 2], [85, 30]]
>>> x = [-10, 0, 77, 54]
>>> d = dict(zip(*x_glob))
>>> [d.get(i, n) for i, n in enumerate(x)]
[85, 0, 30, 54]

或者使用带有多个参数列表的map(或者不使用zip,而是使用itertools.starmap):

>>> list(map(d.get, *zip(*enumerate(x))))
[85, 0, 30, 54]

2

我的解决方案也使用了for循环,但它非常简短优雅(我认为),可以直接在原地工作,并且非常有效,因为它不需要遍历整个x数组,只需要遍历全局列表即可:

for k,v in zip(*x_glob):
    x[k] = v

1
你也可以使用 for k, v in zip(... - tobias_k

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