获取索引数组,在另一个数组中找到匹配的索引并替换值

Posted

技术标签:

【中文标题】获取索引数组,在另一个数组中找到匹配的索引并替换值【英文标题】:Take array of indices, find matching indices in another array and replace values 【发布时间】:2016-10-22 01:33:48 【问题描述】:

我有两个数组,一个数组包含两个数组的所有索引,这些索引满足我在此之前所做的某个条件。另一个数组是布尔数组。我想获取索引数组并在布尔数组中找到相同的位置并替换这些值。

例如,我想做的是:

myIdxs = [0, 3, 5]
myBools = [1, 0, 0, 1, 1, 1, 0, 1, 0, 1] 

并将 myBools 更改为:

myBools = [0, 0, 0, 0, 1, 0, 0, 1, 0, 1]

我试过了:

myBools = [myBools[i] for i in myIdx == 0]

但这并没有给我想要的输出。

【问题讨论】:

我们索引从0 开始,所以不应该是myBools = [0,1,1,0,1,1] 假设我们将每个0 切换到1,反之亦然?你是怎么得到myBools = [1,0,0,1,0,0]的? 抱歉,我不清楚,也没有把事情说清楚。我用正确的索引从 0 编辑了问题 又不清楚了,按照你的逻辑输出不应该是[1, 0, 0, 1, 0, 1, 0, 0, 0, 0]吗? 我想在 myIndxs 给出的索引处将 myBools 的值更改为 0。 【参考方案1】:

我希望这可行(不确定您需要什么):

myIdxs = [0, 3, 5]
myBools = [1, 1, 1, 1, 1, 0]

myBools = [myBools[i] if i in myIdxs else 0
        for i in xrange(len(myBools))]

>>> print myBools
[1, 0, 0, 1, 0, 0]

【讨论】:

【参考方案2】:

措辞不好的问题,但这里有两个答案,都非常简单明了,不需要复杂的列表理解。

如果要将位更改为相反的值

    myIdxs = [0, 3, 5]
    myBools = [1, 0, 0, 1, 1, 1, 0, 1, 0, 1]

    for i in myIdxs:
        myBools[i] ^= 1  # Bitwise operator flips the bit

    print(myBools)

如果要将位更改为零。

    myIdxs = [0, 3, 5]
    myBools = [1, 0, 0, 1, 1, 1, 0, 1, 0, 1]

    for i in myIdxs:
        myBools[i] = 0  # Sets bit to zero

    print(myBools)

输出

考虑到输入,两者的输出实际上是相同的,但不要被骗了,他们做了两件非常不同的事情。

[0, 0, 0, 0, 1, 0, 0, 1, 0, 1]
[0, 0, 0, 0, 1, 0, 0, 1, 0, 1]

【讨论】:

很抱歉给您带来了困惑,我会在以后尝试更清楚。我试图传达后者,而您的解决方案奏效了。感谢您的洞察力和帮助【参考方案3】:

尝试使用带有 if-else 语句的列表推导。

[myBools[i] if i in myIdxs else 0 for i in range(len(myBools))]

输出

[1, 0, 0, 1, 0, 0]

【讨论】:

这个答案重申了另一个answer中已经提到的内容。 @BhargavRao 我在发帖时没看到。但感谢您指出。

以上是关于获取索引数组,在另一个数组中找到匹配的索引并替换值的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中查找最近的值并返回数组的索引

Excel - 需要从数组中搜索列表单元格的子字符串,无法获得索引/匹配工作吗?

数组的访问

我正在尝试映射一个数组并在数组中找到对象的索引

Coffeescript 按索引删除数组值

如何根据数组值获取索引