python 中类似数字模式的最佳方法是什么?

Pal*_*ary 4 python

我正在尝试Python中的模式 if n == 6

1 2 3 4 5
2 3 4 5 1
3 4 5 1 2
4 5 1 2 3
5 1 2 3 4
Run Code Online (Sandbox Code Playgroud)

经过一番思考后,我这样做了 --->

n = 6

for i in range(1,n):
    x = 1
    countj = 0
    for j in range(i,n):
        countj +=1
        print(j,end=" ")
        if j == n-1 and countj < n-1 :
            while countj < n-1:
                print(x , end =" ")
                countj +=1
                x +=1
        
    print()
Run Code Online (Sandbox Code Playgroud)

但我不认为这是最好的方法,我试图寻找一些更好的方法,但无法找到合适的方法,所以我来到这里,是否有更好的方法来解决这个问题?

wim*_*wim 11

我会这样做,使用旋转deque实例:

>>> from collections import deque
>>> n = 6
>>> d = deque(range(1, n))
>>> for _ in range(1, n):
...     print(*d)
...     d.rotate(-1)
... 
1 2 3 4 5
2 3 4 5 1
3 4 5 1 2
4 5 1 2 3
5 1 2 3 4
Run Code Online (Sandbox Code Playgroud)

仅使用范围切片就可能有类似/更短的代码,但也许理解它的工作原理有点困难:

>>> ns = range(1, 6)
>>> for i in ns:
...     print(*ns[i-1:], *ns[:i-1])
... 
1 2 3 4 5
2 3 4 5 1
3 4 5 1 2
4 5 1 2 3
5 1 2 3 4
Run Code Online (Sandbox Code Playgroud)

您还可以创建坐标的数学函数,可能如下所示:

>>> for row in range(5):
...     for col in range(5):
...         print((row + col) % 5 + 1, end=" ")
...     print()
... 
1 2 3 4 5 
2 3 4 5 1 
3 4 5 1 2 
4 5 1 2 3 
5 1 2 3 4 
Run Code Online (Sandbox Code Playgroud)

使用列表理解的一种过于聪明的方法:

>>> r = range(5)
>>> [[1 + r[i - j - 1] for i in r] for j in reversed(r)]
[[1, 2, 3, 4, 5],
 [2, 3, 4, 5, 1],
 [3, 4, 5, 1, 2],
 [4, 5, 1, 2, 3],
 [5, 1, 2, 3, 4]]
Run Code Online (Sandbox Code Playgroud)

more-itertools有这个功能:

>>> from more_itertools import circular_shifts
>>> circular_shifts(range(1, 6))
[(1, 2, 3, 4, 5),
 (2, 3, 4, 5, 1),
 (3, 4, 5, 1, 2),
 (4, 5, 1, 2, 3),
 (5, 1, 2, 3, 4)]
Run Code Online (Sandbox Code Playgroud)