我想在python中绘制一个普通的终端网格,或者你可以用蛇形和梯形方式打印数字。底线按顺序为1到10,上面的行应该是11到20但是按相反顺序继续这个直到100.我怎样才能用Python实现这个目的?对此的可扩展解决方案将非常感激。感谢。
编辑:好的,我想出了这个解决方案。有没有其他方法来实现它。也许是更加pythonic的方式或更少的时间和空间复杂性?
numbers = [i+1 for i in range(100)]
numbers = numbers[::-1]
levels = [i for i in numbers[::-10]]
is_reversed = False
for level in levels:
if is_reversed:
for number in reversed(numbers[level-1:level+9]):
print('{:4}'.format(number), end='')
else:
for number in numbers[level-1:level+9]:
print('{:4}'.format(number), end='')
is_reversed = not is_reversed
print()
答案 0 :(得分:3)
下面使用列表推导来首先制作列表,然后使用第二个来反转每隔一行。关键是好的'模数%
。
rows = [[f'{(n+1) + (i*10):4}' for n in range(10)] for i in range(10)]
rows = reversed([reversed(rows[i]) if i%2 else rows[i] for i in range(len(rows))])
for row in rows:
print(' | '.join(row))
结果:
100 | 99 | 98 | 97 | 96 | 95 | 94 | 93 | 92 | 91
81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90
80 | 79 | 78 | 77 | 76 | 75 | 74 | 73 | 72 | 71
61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70
60 | 59 | 58 | 57 | 56 | 55 | 54 | 53 | 52 | 51
41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50
40 | 39 | 38 | 37 | 36 | 35 | 34 | 33 | 32 | 31
21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30
20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10
最近的一次性能测试表明,enumerate
比使用range
和索引更具效果。这改变了第二行看起来像:
rows = reversed([reversed(row) if i%2 else row for i, row in enumerate(rows)])
答案 1 :(得分:2)
这里i从99到0(包括两端),代码正在打印(i +1),即从100到1。
i // 10将为10个连续数字返回相同的值。根据天气,该值是奇数或偶数,确定打印顺序。
这里我是从99到0,即降序。因此,要以相反的顺序打印,第一列需要跳到-10。对于第二列,我们需要跳到-9。但是对于第二列,i也会减少1。因此,我们应该以-8跳。这里的-8 = -10 + 2以通用方式“跳转= -10 + 2(第j列)”,这里的列号j是从0到9。当我将i除以10时,就是余数。
这就是方法,我们在备用行得到相反的顺序
def snake_ladder():
for i in range(99, -1, -1):
if (i // 10) % 2 == 0:
print("{0:4d}".format(i - 10 + 2 * (10 - (i % 10))), end=" ")
else:
print("{0:4d}".format(i + 1), end=" ")
if i % 10 == 0:
print("\r")
if __name__ == "__main__":
snake_ladder()
输出:
100 99 98 97 96 95 94 93 92 91
81 82 83 84 85 86 87 88 89 90
80 79 78 77 76 75 74 73 72 71
61 62 63 64 65 66 67 68 69 70
60 59 58 57 56 55 54 53 52 51
41 42 43 44 45 46 47 48 49 50
40 39 38 37 36 35 34 33 32 31
21 22 23 24 25 26 27 28 29 30
20 19 18 17 16 15 14 13 12 11
1 2 3 4 5 6 7 8 9 10
答案 2 :(得分:1)
for x in range(1, 101): # 1 - 100
print ("%03d" % (101 - x,), end = " | ") # make all numbers 3 digits
if x % 10 == 0: # every ten line output a new line
print()
输出
100 | 099 | 098 | 097 | 096 | 095 | 094 | 093 | 092 | 091 |
090 | 089 | 088 | 087 | 086 | 085 | 084 | 083 | 082 | 081 |
080 | 079 | 078 | 077 | 076 | 075 | 074 | 073 | 072 | 071 |
070 | 069 | 068 | 067 | 066 | 065 | 064 | 063 | 062 | 061 |
060 | 059 | 058 | 057 | 056 | 055 | 054 | 053 | 052 | 051 |
050 | 049 | 048 | 047 | 046 | 045 | 044 | 043 | 042 | 041 |
040 | 039 | 038 | 037 | 036 | 035 | 034 | 033 | 032 | 031 |
030 | 029 | 028 | 027 | 026 | 025 | 024 | 023 | 022 | 021 |
020 | 019 | 018 | 017 | 016 | 015 | 014 | 013 | 012 | 011 |
010 | 009 | 008 | 007 | 006 | 005 | 004 | 003 | 002 | 001 |