gpt4 book ai didi

python - 我应该如何处理 Python 中的包含范围?

转载 作者:IT老高 更新时间:2023-10-28 21:33:36 25 4
gpt4 key购买 nike

我正在一个领域中工作,在该领域中,范围通常是包含性描述的。我有人类可读的描述,例如 from A to B ,代表包括两个端点的范围 - 例如from 2 to 4意味着 2, 3, 4 .

在 Python 代码中使用这些范围的最佳方法是什么?以下代码可用于生成包含范围的整数,但我还需要执行包含切片操作:

def inclusive_range(start, stop, step):
return range(start, (stop + 1) if step >= 0 else (stop - 1), step)

我看到的唯一完整的解决方案是明确使用 + 1 (或 - 1 )每次我使用 range或切片符号(例如 range(A, B + 1)l[A:B+1]range(B, A - 1, -1) )。这种重复真的是处理包含范围的最佳方式吗?

编辑:感谢 L3viathan 的回答。写一个 inclusive_slice功能补充 inclusive_range当然是一个选择,虽然我可能会写成如下:
def inclusive_slice(start, stop, step):
...
return slice(start, (stop + 1) if step >= 0 else (stop - 1), step)
...这里表示处理负索引的代码,当与切片一起使用时,这些代码并不简单 - 请注意,例如,如果 slice_to == -1,L3viathan 的函数会给出不正确的结果。 .

然而,似乎是 inclusive_slice函数使用起来会很尴尬 - 是 l[inclusive_slice(A, B)]真的比 l[A:B+1]更好?

有没有更好的方法来处理包含范围?

编辑 2:谢谢你的新答案。我同意 Francis 和 Corley 的观点,即改变切片操作的含义,无论是全局的还是某些类的,都会导致严重的混淆。因此,我现在倾向于写一个 inclusive_slice功能。

为了回答我之前编辑中的问题,我得出的结论是,使用这样的函数(例如 l[inclusive_slice(A, B)] )比手动加/减 1(例如 l[A:B+1] )更好,因为它允许边缘情况(例如 B == -1B == None )在一个地方处理。我们可以减少使用该功能的尴尬吗?

编辑 3:我一直在思考如何改进使用语法,目前看起来像 l[inclusive_slice(1, 5, 2)] .特别是,如果包含切片的创建类似于标准切片语法,那就太好了。为了允许这个,而不是 inclusive_slice(start, stop, step) ,可能有一个函数 inclusive将切片作为参数。 inclusive 的理想用法语法将是线 1 :
l[inclusive(1:5:2)]          # 1
l[inclusive(slice(1, 5, 2))] # 2
l[inclusive(s_[1:5:2])] # 3
l[inclusive[1:5:2]] # 4
l[1:inclusive(5):2] # 5

不幸的是,Python 不允许这样做,它只允许使用 : [] 中的语法. inclusive因此必须使用任一语法 2 调用或 3 (其中 s_ 的作用类似于 the version provided by numpy )。

其他可能性是使 inclusive进入一个对象 __getitem__ , 允许语法 4 ,或申请 inclusive仅到 stop切片的参数,如语法 5 .不幸的是,我不相信后者可以工作,因为 inclusive需要了解 step值(value)。

在可行的语法(原始 l[inclusive_slice(1, 5, 2)] ,加上 234 )中,哪个最好用?或者还有其他更好的选择吗?

最终编辑:谢谢大家的回复和评论,这很有趣。我一直是 Python 的“一种方式来做”哲学的粉丝,但是这个问题是由 Python 的“一种方式”和问题域所禁止的“一种方式”之间的冲突引起的。我肯定对 TIMTOWTDI 有了一些赞赏。在语言设计方面。

由于给出了第一个和最高票数的答案,我将赏金奖励给了 L3viathan。

最佳答案

为包含切片编写一个附加函数,并使用它代替切片。虽然有可能例如子类列表并实现 __getitem__对切​​片对象使用react,我建议不要这样做,因为您的代码将与除您之外的任何人的预期相反——并且可能在一年内对您也是如此。
inclusive_slice看起来像这样:

def inclusive_slice(myList, slice_from=None, slice_to=None, step=1):
if slice_to is not None:
slice_to += 1 if step > 0 else -1
if slice_to == 0:
slice_to = None
return myList[slice_from:slice_to:step]

我个人会做的就是使用您提到的“完整”解决方案( range(A, B + 1)l[A:B+1] )并发表评论。

关于python - 我应该如何处理 Python 中的包含范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29596045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com