首页 > 解决方案 > 此代码如何创建数字“飞镖”?

问题描述

我已经尝试学习 Python 几个月了。我一直在 edabit.com 上进行练习,一直在掌握“难”和“非常难”的任务。我想我会试一试“专家”问题,看看我会遇到什么。我被要求从整数列表中创建一个方形“飞镖”,只需给出长度即可。

练习可以在这里找到: https ://edabit.com/challenge/Kv8DMmwfuKTLyZD5E

输出应如下所示:

make_dartboard(8) ➞ [
  11111111,
  12222221,
  12333321,
  12344321,
  12344321,
  12333321,
  12222221,
  11111111
]

不出所料,我真的被难住了。将其视为学习练习,我继续查看其他用户的解决方案并遇到以下代码:

有问题的代码:

def make_dartboard(n):
    row, top = 0, []
    for i in range(n, 0, -2):
        row += int('{:0^{}}'.format('1'*i, n))
        top.append(row)
    bottom = top[::-1][1:] if n%2 else top[::-1]
    return top + bottom

我已经查看了一个多小时,但不能完全辨别这段代码是如何运作的。我承认有无数的 Python 概念、函数​​和语法我仍然不明白,但我真的很想了解(例如,.format() 对我来说仍然是一个全新的函数,但仍然不完全明白它)。

有人会这么好心地分解这段代码中到底发生了什么吗?真正让我失望的是第 4 行和第 6 行。

我很感激你愿意给我的任何时间,也很感激你甚至花时间通读了这篇文章。

*我要感谢 edabit 用户 Joshua Señoron 和 zatoichi49 分别创建和解决问题。

标签: python

解决方案


例如,我们正在制作一个 size(5) 的飞镖盘,输出应该是:

>>> make_dartboard(5)
[11111, 12221, 12321, 12221, 11111]

让我们逐行看代码:

for i in range(n, 0, -2): ->for i in [5, 3, 1]

row += int('{:0^{}}'.format('1'*i, n))

^ in string formatting指:

强制场在可用空间内居中。

'{:0^{}}'.format('1'*i, n)),它给出了 n 长度的字符串,其中中心填充的i数量为外部。更多关于。'1''0'string.format()

  1. i = 5n = 5它给出'11111'。
  2. i = 3,n = 5它给出 '01110'
  3. i = 1n = 5它给出 '00100'

在 forloop 中,row等于它的累积总和int(因此可以相加):

  1. 与,i = 5n = 5row-> 11111
  2. 与,i = 3n = 5row-> 12221
  3. 与,i = 1n = 5row-> 12321

rows 是按顺序追加的,top其余代码是按与 . 的相反顺序创建相同的列表bottomtop最后,返回和的串联列表bottom

bottom = top[::-1][1:] if n%2 else top[::-1] #code [::-1] reverses the list bottom从下到上复制top列表。如果n是偶数,它会从最底部开始复制。如果n很奇怪,您可能会注意到,在 concat torow时需要跳过一个独特的中心。bottomtop

让我知道它是否有帮助。


推荐阅读