Python 如何使方向逻辑从尝试/例外的混乱中干涸
我正试图将我的解决方案简化为(在20x20网格中找到行中4个数字的最大乘积) 我对我的回答的主要不满是在xy子列表定义中的四个try/except子句。我有一个四行列表,每个方向(东、南、东南和西南)都有一个列表,可能会从黑板上消失。对于简化或干涸这个实现,您有什么建议吗Python 如何使方向逻辑从尝试/例外的混乱中干涸,python,Python,我正试图将我的解决方案简化为(在20x20网格中找到行中4个数字的最大乘积) 我对我的回答的主要不满是在xy子列表定义中的四个try/except子句。我有一个四行列表,每个方向(东、南、东南和西南)都有一个列表,可能会从黑板上消失。对于简化或干涸这个实现,您有什么建议吗 from operator import mul with open("11.txt") as f: nums = [[int(num) for num in line.split(' ')] for line in
from operator import mul
with open("11.txt") as f:
nums = [[int(num) for num in line.split(' ')] for line in f.read().split('\n')]
def prod(lst):
return reduce(mul, lst, 1)
def sub_lists_at_xy(array, length, x, y):
try:
east=array[y][x:x+length]
except IndexError:
east=[0]*length
try:
south=[list[x] for list in array[y:y+length]]
except IndexError:
south=[0]*length
try:
southeast=[array[y+i][x+i] for i in range(length)]
except IndexError:
southeast=[0]*length
try:
southwest=[array[y+i][x-i] for i in range(length)]
except IndexError:
southwest=[0]*length
return east, south, southeast, southwest
sub_lists=[]
for x in range(len(nums[0])):
for y in range(len(nums)):
sub_lists += sub_lists_at_xy(nums, 4, x, y)
best = max(prod(lst) for lst in sub_lists)
print(best)
您可以检查输入,但也可以填充阵列
with open("11.txt") as f:
nums = [["X"] + [int(num) for num in line.split(' ')] + ["X"] for line in f.read().split('\n')]
nums = ["X"]*(len(nums[0])+2) + nums + ["X"]*(len(nums[0])+2)
然后可以过滤数据
reduce(mul, [x for x in lst if x != "X"], 1)
要遵循“不要重复自己”规则,您可以拉出方向逻辑:
def sub_lists_at_xy(array, length, x, y):
directions = [(1, 0), (0, 1), (1, 1), (-1, 1)]
sublists = []
for dx, dy in directions:
try:
seq = [array[y+dy*i][x+dx*i] for i in range(length)]
sublists.append(seq)
except IndexError:
pass
return sublists
你可能想确认我没有弄错方向——我通常会在所有地方都犯符号错误——但你明白了
[注意:这不是我自己的做法,而是我简化代码的方法。]为什么不先测试x和y值是否在范围内,然后可以避免所有的
尝试…例外情况。有没有一种优雅的方法来做到这一点?我的第一个倾向是,东部、南部、东南部和西南部的每一个都需要对x和/或y进行不同的检查。当我做一些研究时,我发现有人建议我养成使用try…的习惯,除了s来避免比赛条件(虽然在本例中这不是一个问题)。@dylan-你从哪里读到的关于比赛条件和try/catch的文章?它们之间的关系不是很密切——例外不会阻止比赛条件。@dfb现在找不到它,但我正在阅读一篇关于三思而后行、请求原谅比请求允许更容易的优点的讨论。你是对的,我不确定我是否理解EAFP为什么会阻止比赛条件。更重要的是,在这种情况下,整个比赛条件的事情是不相关的,因为在这里不可能发生这种情况。你可以,但它不是很像蟒蛇。@JoelCornett-为什么填充数据不是蟒蛇?在我看来,这比放入一堆if语句来替换try/excepty更干净。是的,我想填充我的数组,但找不到一种优雅的方法。您的解决方案很有趣。@JoelCornett也许有一种更“含蓄”/“优雅”的填充方式可以达到相同的目的。@JoelCornett-:)。我的评论很中肯。这也是ACM风格的编程竞赛的典型解决方案。我喜欢你的做法。谢谢@DSM。