python - 此代码如何创建数字“飞镖”?
问题描述
我已经尝试学习 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 分别创建和解决问题。
解决方案
例如,我们正在制作一个 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))
强制场在可用空间内居中。
'{:0^{}}'.format('1'*i, n))
,它给出了 n 长度的字符串,其中中心填充的i
数量为外部。更多关于。'1'
'0'
string.format()
- 和
i = 5
,n = 5
它给出'11111'。- 和
i = 3
,n = 5
它给出 '01110'- 和
i = 1
,n = 5
它给出 '00100'
在 forloop 中,row
等于它的累积总和int
(因此可以相加):
- 与,
i = 5
和n = 5
,row
-> 11111- 与,
i = 3
和n = 5
,row
-> 12221- 与,
i = 1
和n = 5
,row
-> 12321
row
s 是按顺序追加的,top
其余代码是按与 . 的相反顺序创建相同的列表bottom
。top
最后,返回和的串联列表bottom
bottom = top[::-1][1:] if n%2 else top[::-1] #code [::-1] reverses the list
bottom
从下到上复制top
列表。如果n
是偶数,它会从最底部开始复制。如果n
很奇怪,您可能会注意到,在 concat torow
时需要跳过一个独特的中心。bottom
top
让我知道它是否有帮助。
推荐阅读
- spring-boot - 字符串参数“变量名”没有定义最大长度
- android - Xamarin.Android:错误 android.view.View.mPrivateFlags NullReferenceException
- git - 当我尝试删除分支时,我收到一条消息说“Head is now at f33dc83”
- reactjs - 如何制作具有泛型类型的功能性 React 组件?
- python - Python,在同一行打印
- editor - 如何使用 vi 编辑器在文件中搜索目录路径
- discord.py - 如何让我的 discord.py 机器人只允许来自管理员和模组的 @everyone 和 @here,而不是来自普通成员的
- java - 如何更改标记位置并使用它更改谷歌地图视图
- pine-script - 当 calc_on_every_tick=true 时,Pine-script 如何在关闭时计算
- db2 - db2 中带有删除语句的摄取实用程序不显示已删除的行数