【问题标题】:Looking to iterate through list of lists that skips over specific indices希望遍历跳过特定索引的列表列表
【发布时间】:2022-01-07 21:54:00
【问题描述】:

我目前正在处理一个 Python 3 项目,该项目涉及对列表列表进行多次迭代,并且我想编写一个跳过此列表列表的特定索引的代码。特定索引存储在单独的列表列表中。我写了一个小列表,grid 和我不想迭代的值,coordinates

grid = [[0, 0, 1], [0, 1, 0], [1, 0, 0]]
coordinates = [[0, 2], [1, 1], [2, 0]]

基本上,我希望跳过grid 中的每个1(1 只是用来使相应的坐标位置更明显)。

我尝试了以下代码无济于事:

for row in grid:
    for value in row:
        for coordinate in coordinates:
            if coordinate[0] != grid.index(row) and coordinate[1] != row.index(value):
                row[value] += 4
   
print(grid)

预期输出为:[[4, 4, 1], [4, 1, 4], [1, 4, 4]]

执行代码后,我收到了ValueError: 1 is not in list

我有两个问题:

  1. coordinates 中的每个coordinate 包含第0 位和第1 位时,为什么我会收到此错误消息?

  2. 有没有比使用 for 循环更好的方法来解决这个问题?

【问题讨论】:

    标签: python list loops iteration


    【解决方案1】:

    您的代码有两个问题。

    1. row 包含整数列表,value 包含这些行中的值。问题是您需要访问这些值的索引,而不是值本身。您设置循环的方式不允许这样做。

    2. .index() 返回传入参数的第一个实例的索引;它不是使用带括号的索引的直接替代品。

    这是一个代码 sn-p,它可以完成您所描述的操作,解决了上述两个问题:

    grid = [[0, 0, 1], [0, 1, 0], [1, 0, 0]]
    coordinates = [[0, 2], [1, 1], [2, 0]]
    for row in range(len(grid)):
        for col in range(len(grid[row])):
            if [row, col] not in coordinates:
                grid[row][col] += 4
       
    print(grid)  # -> [[4, 4, 1], [4, 1, 4], [1, 4, 4]]
    

    顺便说一句,如果您有很多坐标,您可以将其设为set 元组而不是二维列表,这样您就不必为每个行/列索引对遍历整个列表。该集合看起来像coordinates = {(0, 2), (1, 1), (2, 0)},如果您使用的是集合,您将使用if (row, col) not in coordinates:,而不是if [row, col] not in coordinates:

    【讨论】:

    • 这并不能解决问题。代码没有考虑坐标告诉网格中的哪些值添加 4,无论它是否为 1
    • 对我来说,OP 似乎主要关心坐标而不是实际值——列表中的坐标恰好都包含 1。
    • 这太棒了,效果很好,非常感谢!我正在处理 5 个独特的坐标,所以我认为这不是什么大问题,尽管我很好奇;如果我使用一组元组而不是坐标列表的列表,它会是什么样子?
    • 编辑成原始答案。
    【解决方案2】:

    对于任何想看的人来说,这是一种 numpy 方法 -

    import numpy as np
    
    g = np.array(grid)
    c = np.array(coordinates)
    
    mask = np.ones(g.shape, bool)
    mask[tuple(c.T)] = False
    
    #This mask skips each coordinate in the list
    g[mask]+=4
    
    print(g)
    
    [[4 4 1]
     [4 1 4]
     [1 4 4]]
    

    对于那些喜欢的人来说,还有一个单行列表理解 -

    [[j+4 if [row,col] not in coordinates else j for col,j in enumerate(i)] for row,i in enumerate(grid)]
    
    [[4, 4, 1], [4, 1, 4], [1, 4, 4]]
    

    【讨论】:

      【解决方案3】:
      grid = [
          [0, 0, 1],
          [0, 1, 0],
          [1, 0, 0]]
      coordinates = [[0, 2], [1, 1], [2, 0]]
      
      for y, row in enumerate(grid):
          for x, value in enumerate(row):
              if [x, y] in coordinates or value != 1:
                  grid[y][x] += 4
         
      print(grid)
      

      【讨论】:

      • 这如何回答 OP 的第一个问题?
      • 使用枚举值可能更简洁:row[x] = value + 4 而不是grid[y][x] += 4
      • 这段代码回答了这两个问题
      猜你喜欢
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-06
      相关资源
      最近更新 更多