Python中文
首页
教程
问答
标签
搜索
登录
注册
我应该如何处理Python中的包含范围?
回答此问题可获得
20
贡献值,回答如果被采纳可获得
50
分。
<p>我在一个领域工作,在这个领域中,范围通常被包括在内地描述。我有人类可读的描述,例如<code>from A to B</code>,它表示包含两个端点的范围,例如<code>from 2 to 4</code>表示<code>2, 3, 4</code>。</p> <p>在Python代码中使用这些范围的最佳方法是什么?以下代码可用于生成包含范围的整数,但我还需要执行包含切片操作:</p> <pre><code>def inclusive_range(start, stop, step): return range(start, (stop + 1) if step >= 0 else (stop - 1), step) </code></pre> <p>我看到的唯一完整解决方案是每次使用<code>+ 1</code>(或<code>- 1</code>)或切片表示法(例如<code>range(A, B + 1)</code>、<code>l[A:B+1]</code>、<code>range(B, A - 1, -1)</code>)时显式使用<code>+ 1</code>(或<code>- 1</code>)。这种重复真的是处理包含范围的最佳方法吗?</p> <p><strong>编辑:</strong>感谢L3viathan的回答。写一个<code>inclusive_slice</code>函数来补充<code>inclusive_range</code>当然是一个选项,尽管我可能会这样写:</p> <pre><code>def inclusive_slice(start, stop, step): ... return slice(start, (stop + 1) if step >= 0 else (stop - 1), step) </code></pre> <p>这里的<code>...</code>表示处理负索引的代码,这在与切片一起使用时并不简单-注意,例如,如果<code>slice_to == -1</code>,l3viaan的函数会给出不正确的结果。</p> <p>然而,似乎一个<code>inclusive_slice</code>函数会很难使用-<code>l[inclusive_slice(A, B)]</code>真的比<code>l[A:B+1]</code>更好吗?</p> <p>有没有更好的方法来处理包含的范围?</p> <p><strong>编辑2:</strong>感谢您提供新答案。我同意Francis和Corley的观点,即改变slice操作的含义,无论是全局的还是某些类的,都会导致严重的混淆。因此,我现在倾向于编写一个<code>inclusive_slice</code>函数。</p> <p>为了回答我之前编辑的问题,我得出的结论是,使用这样的函数(例如<code>l[inclusive_slice(A, B)]</code>)比手动加/减1(例如<code>l[A:B+1]</code>)要好,因为它允许在一个地方处理边案例(例如<code>B == -1</code>和<code>B == None</code>)。我们能减少使用这个函数时的尴尬吗?</p> <p><strong>编辑3:</strong>我一直在考虑如何改进用法语法,它目前看起来像<code>l[inclusive_slice(1, 5, 2)]</code>。特别是,如果创建的包含切片类似于标准切片语法,那将是很好的。为了允许这样做,而不是<code>inclusive_slice(start, stop, step)</code>,可能有一个函数<code>inclusive</code>将切片作为参数。<code>inclusive</code>的理想用法语法是行<code>1</code>:</p> <pre><code>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 </code></pre> <p>不幸的是,Python不允许这样做,它只允许在<code>[]</code>中使用<code>:</code>语法。<code>inclusive</code>因此必须使用语法<code>2</code>或<code>3</code>调用(其中<code>s_</code>的作用类似于<a href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.s_.html" rel="noreferrer">the version provided by numpy</a>)。</p> <p>其他的可能性是使<code>inclusive</code>成为一个具有<code>__getitem__</code>的对象,允许语法<code>4</code>,或者只将<code>inclusive</code>应用于切片的<code>stop</code>参数,如语法<code>5</code>。不幸的是,我不相信后者能够工作,因为<code>inclusive</code>需要了解<code>step</code>值。</p> <p>在可行的语法中(原始的<code>l[inclusive_slice(1, 5, 2)]</code>,加上<code>2</code>,<code>3</code>和<code>4</code>),哪一个是最好的?或者还有其他更好的选择吗?</p> <p><strong>最后编辑:</strong>感谢大家的回复和评论,这非常有趣。我一直都是Python“单向”哲学的粉丝,但这个问题是由Python的“单向”和问题领域所禁止的“单向”之间的冲突引起的。我确实对语言设计中的<a href="http://en.wikipedia.org/wiki/There%27s_more_than_one_way_to_do_it" rel="noreferrer">TIMTOWTDI</a>有些欣赏。</p> <p>因为我给出了第一个也是最高票数的答案,所以我把奖金颁给了L3viathan。</p>
0 条评论
分类:
Python问答
请先
登录
后评论
默认排序
时间排序
1 个回答
匿名
1天前
擅长:python、mysql、java
<p>如果您不想指定步骤大小,而是指定步骤数,则可以使用<code>numpy.linspace</code>选项,该选项包括起点和终点</p> <pre><code>import numpy as np np.linspace(0,5,4) # array([ 0. , 1.66666667, 3.33333333, 5. ]) </code></pre>
请先
登录
后评论
针对此问题:
更多的回答
关注
89
关注
收藏
1
收藏,
216
浏览
网友 提问于 2天前
相关Python问题
plt.savefig不会覆盖现有文件
4 回答
plt.savefig不保存图像
2 回答
plt.savefig在jupyter笔记本中不起作用
7 回答
plt.savefig在从另一个fi调用时停止工作
7 回答
plt.savefig在调用plt.show之前保存空数字
5 回答
plt.save不创建png文件
6 回答
plt.scatter overlay分类数据帧列
3 回答
Plt.Scatter:如何添加title、xlabel和ylab
9 回答
plt.scatter()绘图与Matplotlib中的plt.plot()绘图类似
3 回答
plt.scatter错误'NoneType'对象在成功运行后没有属性'sqrt'
9 回答
plt.set_title()中的标题字符串有误
8 回答
plt.show()
1 回答
plt.show()不在Jupyter笔记本上渲染任何内容
3 回答
plt.show()不打印plt.plot only plt.scatter
1 回答
plt.show()不显示三维散射图像
8 回答
plt.show()不显示任何内容
1 回答
plt.show()不显示数据,而是保留它供下一个图表使用(spyder)
7 回答
plt.show()使终端挂起
1 回答
plt.show()无法使用此代码
5 回答
plt.show()没有打开新的图形风
5 回答