2015-01-12 5 views
1

В принципе мне нужно списки строк, которые идут так:Нужна умный способ создать большой список для Pygame/проект PyOpenGL

[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)] ....] и т.п.

+0

Что вы хотите сделать с этими списками в Pygame? показать желаемый результат пожалуйста. – GLHF

+0

- это то, что вы хотели? –

+0

Если вы просто собираетесь перебирать их, вы должны рассмотреть генератор вместо списка. –

ответ

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)] 
1
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