【问题标题】:Need a clever way to create a large list for a pygame/pyOpenGL project需要一种聪明的方法来为 pygame/pyOpenGL 项目创建一个大列表
【发布时间】:2015-01-12 02:22:19
【问题描述】:

基本上我需要这样的行列表:

[0,0]

[1,0],[0,1]

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

[3,0],[2,1],[1,2],[0,3]

[4,0],[3,1],[2,2],[1,3],[0,4]

最多任意数量的元素,然后返回

[4,1],[3,2],[2,3],[1,4]

[4,2],[3,3],[2,4]

[4,3],[3,4]

[4,4]

我只想将所有这些对放在一个大列表中,因此我可以按照它们在上面出现的顺序迭代这些对以进行等距渲染。

输出看起来像这样

[ [ (0,0) ], [ (1,0),(0,1) ], [ (2,0), (1,1), (0,2) ]....]等等

【问题讨论】:

  • 你想在 Pygame 中用这个列表做什么?请显示所需的输出。
  • 这就是你想要的吗?
  • 如果您只是要迭代这些,您应该考虑使用生成器而不是列表。

标签: python list tile isometric


【解决方案1】:

尚不完全清楚您正在寻找什么概括,但 IIUC 有很多方法可以做到这一点。一种是从前一个列表构建每个子列表(向每个子元素添加一个并避免重复),但另一种是直接从算术开始:

def sherwood(n):
    N = 2*n+1
    for i in range(N):
        low, high = max(0, i-n), min(i, n)
        w = list(range(low, high+1))
        yield zip(w[::-1], w)

给我

>>> out = list(sherwood(2))
>>> for x in out: print(x)
[(0, 0)]
[(1, 0), (0, 1)]
[(2, 0), (1, 1), (0, 2)]
[(2, 1), (1, 2)]
[(2, 2)]
>>> out = list(sherwood(4))
>>> for x in out: print(x)
[(0, 0)]
[(1, 0), (0, 1)]
[(2, 0), (1, 1), (0, 2)]
[(3, 0), (2, 1), (1, 2), (0, 3)]
[(4, 0), (3, 1), (2, 2), (1, 3), (0, 4)]
[(4, 1), (3, 2), (2, 3), (1, 4)]
[(4, 2), (3, 3), (2, 4)]
[(4, 3), (3, 4)]
[(4, 4)]

【讨论】:

    【解决方案2】:
    def create_lists(max_num):
        retlist = []
    
        for i in range(max_num+1):
            i_list = []
            for j in range(i, -1, -1):
                i_list.append((j, i-j))
            retlist.append(i_list)
    
        for i in range(1, max_num+1):
            i_list = []
            for j in range(i, max_num+1):
                i_list.append((max_num+i-j, j))
            retlist.append(i_list)
    
        return retlist
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 2010-12-28
      • 1970-01-01
      • 2020-08-28
      • 2015-04-07
      • 2012-08-30
      • 1970-01-01
      相关资源
      最近更新 更多