【问题标题】:take 1 list of lists and make x number of squares where x is the size of the list in python取1个列表并制作x个正方形,其中x是python中列表的大小
【发布时间】:2013-09-26 06:39:02
【问题描述】:

所以我正在为一个班级做一个项目,它调用创建一个列表,你有一个 9x9 的正方形,并创建一个新列表,它将是 9 组 3x3。

示例列表:

L = [[5,3,4,6,7,8,9,1,2],
     [6,7,2,1,9,5,3,4,8],
     [1,9,8,3,4,2,5,6,7],
     [8,5,9,7,6,1,4,2,3],
     [4,2,6,8,5,3,7,9,1],
     [7,1,3,9,2,4,8,5,6],
     [9,6,1,5,3,7,2,8,4],
     [2,8,7,4,1,9,6,3,5],
     [3,4,5,2,8,6,1,7,9]]

所以我希望我的新列表是:

newL = [[5,3,4,6,7,2,1,9,8],
       ....

希望你能看到模式。

5 小时后,我基本上能够通过列表理解重新创建列表:

List = [[row[col] for col in range(len(list1))] for row in  list1]

那么我能得到的最接近的是:

List = [[row[col] for col in range(int(sqrtofsize)] for row in  list1]

它会打印出每个元素的前 3 个,然后我虽然可以创建 3 个单独的列表,但唯一的问题是如果你有一个 16x16 的块,它将无法工作。

另一个问题是我不能让它订阅。

我确定那里有信息,虽然我已经找了 5 个小时,但还是搞不清楚。

请要求澄清。

谢谢

【问题讨论】:

    标签: python list python-3.x


    【解决方案1】:
    def subsquare(L, N, x, y):
      return [ [ L[i][j] for j in range(N*y, N*y+N) ] for i in range(N*x, N*x+N) ]
    
    N = 3
    
    L = [[5,3,4,6,7,8,9,1,2],
         [6,7,2,1,9,5,3,4,8],
         [1,9,8,3,4,2,5,6,7],
         [8,5,9,7,6,1,4,2,3],
         [4,2,6,8,5,3,7,9,1],
         [7,1,3,9,2,4,8,5,6],
         [9,6,1,5,3,7,2,8,4],
         [2,8,7,4,1,9,6,3,5],
         [3,4,5,2,8,6,1,7,9]]
    
    subsqaure(L, N, 0, 0)
    [[5, 3, 4], [6, 7, 2], [1, 9, 8]]
    
    for x in range(N):
       for y in range(N):
           print x, y, subsquare(L, N, x, y)
    
    
     0 0 [[5, 3, 4], [6, 7, 2], [1, 9, 8]]
     0 1 [[6, 7, 8], [1, 9, 5], [3, 4, 2]]
     0 2 [[9, 1, 2], [3, 4, 8], [5, 6, 7]]
     1 0 [[8, 5, 9], [4, 2, 6], [7, 1, 3]]
     1 1 [[7, 6, 1], [8, 5, 3], [9, 2, 4]]
     1 2 [[4, 2, 3], [7, 9, 1], [8, 5, 6]]
     2 0 [[9, 6, 1], [2, 8, 7], [3, 4, 5]]
     2 1 [[5, 3, 7], [4, 1, 9], [2, 8, 6]]
     2 2 [[2, 8, 4], [6, 3, 5], [1, 7, 9]]
    

    【讨论】:

    • 这太棒了,它或多或少是我正在寻找的,不过很少有问题。首先,我希望把它放在一个变量中(所以我可以比较它。所以如果我只是把 [ [ L[i][j] for j in range(Ny, Ny +N) ] for i in range(Nx, Nx+N) ] 变成一个变量,它会给我我想要的东西,还是那个变量只保存最后一组?第二个你知道吗关闭和快速组合它们的方法,使其在 9 中而不是 3 中?我将更多地玩这个,希望我能得到它。谢谢。
    • 好的,所以如果你把它扔到一个新的嵌套 for 循环中,它只会保存最后一个条目。所以不知何故我需要用 += 创建一个新列表
    【解决方案2】:

    你可以使用整数除法和取模:

    newL = [[L[3*(i//3)+j//3][3*(i%3)+j%3] for j in range(9)] for i in range(9)]
    

    结果:

    [5、3、4、6、7、2、1、9、8] [6、7、8、1、9、5、3、4、2] [9、1、2、3、4、8、5、6、7] [8、5、9、4、2、6、7、1、3] [7、6、1、8、5、3、9、2、4] [4、2、3、7、9、1、8、5、6] [9、6、1、2、8、7、3、4、5] [5、3、7、4、1、9、2、8、6] [2、8、4、6、3、5、1、7、9]

    在此处查看实际代码:http://ideone.com/XSHhLj

    我将解释使用一个变量迭代 3x3 数组的更简单情况:

    L = [[1,2,3],
         [4,5,6],
         [7,8,9]]
    iterL = [ L[i//3][i%3] for i in range(9) ]
    

    结果:

    [1、2、3、4、5、6、7、8、9]

    因此,每增加 3,您就将行加一(使用 i//3 完成),并将列设置为 0(使用 i%3 完成)。所以当i=4你会指向索引1,0

    然后用这个思路,扩展成更大的数组。 =)

    要使其适用于可变大小(当然是二次方),只需将每次出现的 3 更改为大小的平方根,并将 9 更改为列表的大小。

    【讨论】:

    • 这取决于您使用的 Python 版本。在我的 Python 2.7.2 上,上面的代码有效(这就是我可以打印结果的原因)。您可以将i/3 转换为int(i/3)j/3 转换为int(j/3) 以确保这一点。但我认为没有必要。
    • 是的,我正在运行 python 3.x,他们想要它,我也认为因为它不正确,我会再试一次。
    • 在 Python 3 中,您应该使用双斜杠进行整数除法:i//3j//3
    • 仍在使用它。这是和第一个帖子的扩展正确吗?
    • 没有这个很棒,只是 Python 新手而已(随你的回答)
    猜你喜欢
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多