在python

时间:2017-04-30 16:49:54

标签: python

我想在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()

3 个答案:

答案 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 |