【问题标题】:Check if value is between pair of values in a tuple?检查值是否在元组中的一对值之间?
【发布时间】:2014-03-14 03:22:12
【问题描述】:

有没有一种有效的方法(很好的语法)来检查一个值是否在一个元组中包含的两个值之间?

我能想到的最好的事情是:

t = (1, 2)
val = 1.5
if t[0] <= val <= t[1]:
    # do something

有没有更好的方法来编写条件?

【问题讨论】:

  • 链式条件到底有什么问题?我能提供的唯一改进是首先对边界进行元组解包:low, high = t 然后if low &lt;= val &lt;= high:..
  • 没什么,我想知道是否有语法糖来检查一个值是否在一个元组中的其他两个值之间。
  • 不,你已经在这里找到了语法。

标签: python conditional tuples


【解决方案1】:

不,没有专门的语法,使用链式比较已经是正确的方法了。

我可以提供的一个“好”是首先使用元组解包,但这只是可读性结冰:

low, high = t
if low <= val <= high:

如果您使用由collection.namedtuple() 生成的元组子类,您当然也可以在此处使用属性:

from collections import namedtuple

range_tuple = namedtuple('range_tuple', 'low high')
t = range_tuple(1, 2)

if t.low <= val <= t.high:

【讨论】:

  • 这是一个不错的 Pythonic 小事。
【解决方案2】:

你可以自己做糖:

class MyTuple(tuple):

    def between(self, other):
        # returns True if other is between the values of tuple 
        # regardless of order
        return min(self) < other < max(self)

        # or if you want False for MyTuple([2,1]).between(1.5)
        # return self[0] < other < self[1]

mt=MyTuple([1,2])    
print mt.between(1.5)
# True

【讨论】:

  • 这是一个聪明的想法,但是通过装饰来实现不是更好吗?
  • -1:为这个简单的编程问题创建一个类。占用大量内存和 CPU 开销。
  • @MaximeLorant:这似乎有点苛刻。所有这一切都是对现有类tuple 进行子类化,并添加他询问是否存在的函数。如果他的需求值得继承现有课程,难道不是由 OP 决定的吗? Python 中的很多东西不是因为有类而简单吗?
  • @dawg 我发现 Martijn 的回答实际上更简洁(一如既往)。确实它是现有类的子类,但它比仅解压缩创建命名元组的 2 个元素更重(就可读性而言)......对于一些更复杂的操作,创建一个类是合理的,但是我同意 :-)
  • @MaximeLorant:很好,马丁的回答很棒。我投了赞成票。但是这个答案是-1,你的评论有点苛刻。通过子类化将您想要的语法添加到 Python 类是很有用的。这取决于 OP。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-05
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
  • 1970-01-01
相关资源
最近更新 更多