我正在研究hackerrank:https://www.hackerrank.com/challenges/botcleanlarge
许多提交的代码行都非常长。 然后是这样:
def next_move(posr, posc, board):
i, j = min(((i, j) for i, row in enumerate(board) if 'd' in row for j, c in enumerate(row) if c == 'd'), key=lambda x: abs(posr - x[0]) + abs(posc - x[1]))
print("LEFT" if j < posc else "RIGHT" if j > posc else "UP" if i < posr else "DOWN" if i > posr else "CLEAN")
我大致理解它正在尝试查找下一个最近的单元格。但这一切都混在一起了,我很难尝试分解并理解它。
如果不是太麻烦,有人可以帮我分解一下函数的第一行吗?说用多行重写它会更易读?
我试图用逗号将其分解:
def next_move(posr, posc, board):
i, j = min((
(i, j) for i, row in enumerate(board)
if 'd' in row for j,
c in enumerate(row) if c == 'd'),
key=lambda x: abs(posr - x[0]) + abs(posc - x[1]))
但是我仍然真的不知道它在做什么。 通常,我确实理解“ if”,“ for”,“ enumerate”以及“ key = lambda”的大致含义(在这种情况下,通过比较x的值确定最小值,我对吗?)
请帮帮我:/
答案 0 :(得分:2)
如果您不了解所涉及的句法构造,则用逗号机械地破折将没有用。我由外而内,用括号括起来; min
是一项功能,占用一对。它有两个参数,第一个是一个大括号表达式-事实证明是一种理解-而第二个是一个命名参数。在理解中,我们具有生成表达式和两个for...if
子句,它们都在enumerate
生成的对上进行迭代。
i, j = min(
(
(i, j)
for i, row in enumerate(board) if 'd' in row
for j, c in enumerate(row) if c == 'd'
),
key=lambda x: abs(posr - x[0]) + abs(posc - x[1])
)
因此,假设board
是一个字符串列表,它将查找包含d
的行和d
这些行中的字符,生成成对的各个索引(坐标),然后找到距离(posr, posc)
的曼哈顿距离最低的那对货币对。