【问题标题】:Set negative indices in list to zero将列表中的负索引设置为零
【发布时间】:2019-08-04 02:16:01
【问题描述】:

以下函数被放置在一个 for 循环中,因为 for 循环,索引可以获得高负值,如下例所示:

C_ki[2][1] = max (C_ki[1][1], C_ki[3][-7] , C_ki[2][0])

# C_ki is defined as:

C_ki = [[0]*(7) for x in range(3)]

C_ik = [[0]*(3) for x in range(7)]

为了计算上面的C_ki[2][1],python给出了一个错误列表索引超出范围,因为负索引。 有没有办法将 C_ki[3][-7] 设置为负索引为零或不考虑 max 函数?

【问题讨论】:

  • 你不能在 python 中做len(3)。此外,在这种情况下不能使用大括号。您应该使用这些()[]
  • max() 是一个函数,你需要把你的集合放在括号中,像这样:max({C_ki[1][1], C_ki[3][-7] , C_ki[2][0]})
  • 但是你为什么不能……用0替换-7?是否需要在特定条件下替换它,比如它是否存在?
  • 有一个公式必须考虑在内,有时会给出负值。

标签: python indexing indices


【解决方案1】:

您可以将提取包装在一个函数中,

def get_or_zero(array, i, j):
    try:
        return array[i][j]
    except IndexError:
        return 0

那么你可以在 max 函数中使用get_or_zero(C_ki, i, j) 而不是C_ki[i][j]

【讨论】:

  • 您是否尝试过例如:get_or_zero(C_ki,1,-4)?如果 index 为负,则其索引反转,如果 index 在范围内,则不会出错 @vlizan
【解决方案2】:

如果你想把索引-7只在它存在的情况下,否则索引0,你可以使用三元运算符:

C_ki[2][1] = max(C_ki[1][1], C_ki[3][-7 if len(C_ki[3]) >= 7 else 0] , C_ki[2][0])

如果你只想把索引-7 存在,否则 0

C_ki[2][1] = max(C_ki[1][1], C_ki[3][-7] if len(C_ki[3]) >= 7 else 0, C_ki[2][0])

More on the ternary operator

【讨论】:

  • 如果索引不存在,我相信OP希望将C_ki[3][-7]的整个值设为0
  • 编辑考虑了这两种可能性!
【解决方案3】:

所以,如果i 是您的(可能)负索引,您可以简单地做这样的事情

C_ki[2][1] = max (C_ki[1][1], C_ki[3][max(i,0)] , C_ki[2][0])

如果我怀疑,您希望整个元素值设置为零,而不是使用条件语句

C_ki[2][1] = max (C_ki[1][1], 0 if i <0 else C_ki[3][i] , C_ki[2][0])

【讨论】:

    【解决方案4】:

    注意:由于列表索引超出范围(C_ki[3][-7]),您会收到索引错误

    您的 C_ki 的维度为 [3][7],索引从 0 开始计数到 ​​2。3 超出范围。

    注意:负索引会发生什么:

    示例:

    array = [0,1,2,3,4,5]
    print (array[-1]) # equal array[5]
    

    结果:5

    【讨论】:

      【解决方案5】:

      10 次中有 9 次最好用索引来解决问题,但假设这是第 10 次,内置的 min、max 函数可以组合起来为您提供所需的保护:

      # legal value, no change required
      I= 2
      D=(min(max(I,0),4))
      # D will equal 2
      
      # large negative set to zero
      I= -7
      D=(min(max(I,0),4))
      # D will zero 0
      
      # large positive set to the value of the maximum of 4
      I= 7
      D=(min(max(I,0),4))
      # D will equal 4
      

      【讨论】:

        猜你喜欢
        • 2021-09-09
        • 1970-01-01
        • 2017-05-27
        • 2017-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-15
        • 2021-07-05
        相关资源
        最近更新 更多