Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使方向逻辑从尝试/例外的混乱中干涸_Python - Fatal编程技术网

Python 如何使方向逻辑从尝试/例外的混乱中干涸

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

我正试图将我的解决方案简化为(在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 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。