我怎么能不在羔羊身上重复我的列表呢

2024-04-20 10:34:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图对来自codesignal的挑战抱有不必要的幻想。问题是:“给定一个数和一个范围,找出给定范围内可被给定数整除的最大整数。”

我用l表示左边界,r表示右边界,d表示除数。如果边界内的数字都不可除,则函数必须返回-1。否则,返回最大可除数。你知道吗

有没有办法避免重复这个清单? 有没有更好的方法来做到这一点?(这同样不可读,当然也没有必要)

它们接收NameError: name '_' is not defined,这是有意义的。你知道吗

maxDivisor = lambda l,r,d: _[0] if [i for i in range(l,r+1)[::-1] if i%d==0] else -1

maxDivisor = lambda l,r,d: [i for i in range(l,r+1)[::-1] if i%d==0][0] if _ else -1

这是可行的,但我不想重复我自己:

maxDivisor = lambda l,r,d: [i for i in range(l,r+1)[::-1] if i%d==0][0] if [i for i in range(l,r+1)[::-1] if i%d==0] else -1

这是可行的,但可读性太强:

def maxDivisor(left, right, divisor):
    for i in range(left,right+1)[::-1]:
        if i%divisor ==0:
            return i
    return -1

只是重申一下: maxDivisor(-99,-96,5)应该返回-1maxDivisor(1,10,3)应返回9。你知道吗

谢谢你对我不必要的请求的帮助。你知道吗


Tags: lambdainrightforreturnifrangeleft
1条回答
网友
1楼 · 发布于 2024-04-20 10:34:08

不要仅仅为了写坏的和不可读的代码而写坏的和不可读的代码。1)

相反,我建议使用max和一个生成器表达式和一个默认值,这个默认值是,并读取,这正是您想要的:得到这个范围内的最大数,它是一个除数,如果不存在这样的值,则取-1。你知道吗

res = max((x for x in range(l, r+1) if x%d==0), default=-1)

类似的,但是可能在精神上更接近于您所尝试的,您可以在过滤的反向范围上使用next来获得最大的这样的元素,或者-1作为默认值。你知道吗

res = next((x for x in range(r, l-1, -1) if x%d==0), -1)

如果你真的想变得“花哨”,那么,这样做怎么样:与其测试所有的数字,不如直接在O(1)中得到结果:

res = r - (r % d) if (r - (r % d) >= l) else -1

(所有的参数在这里都是不必要的,但是我想让它更具可读性,所以这甚至可以满足您的部分需求。)


从您的评论来看,似乎您正在尝试"Code Golf",其中的目标是拥有尽可能短的代码。在本例中,您可以使用第三种方法,但是使用这个变量时不使用三元... if ... else ...。这也完全符合您的“不必要和不可读”要求:

x=[r-r%d,-1][r-r%d<l]  # for code-golf only!

我不会告诉你它是怎么工作的,不过,你得自己去弄清楚。你知道吗


1)除非这可能是某种模糊代码挑战。你知道吗

相关问题 更多 >