【问题标题】: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。

标签: python list boolean


【解决方案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 我在发帖时没看到。但感谢您指出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 1970-01-01
    • 1970-01-01
    • 2018-03-28
    • 2020-12-18
    • 1970-01-01
    • 2019-07-02
    相关资源
    最近更新 更多