我有一个3D坐标元组(x,y,z(。我想测试给定元组的 3 个坐标中没有一个低于 (a, b, c(,也没有一个高于 (d, e, f(。通过反复试验和阅读这些论坛,我了解到:
(a, b, c( <= (x, y, z( <= (d, e, f(
不起作用,因为第一个表达式计算,然后获取该结果(0 或 1(并在下一个计算中使用它,依此类推。所以现在我尝试了:
((a, b, c( <= (x, y, z(( 和 ((x, y, z( <= (d, e, f((
这也不起作用,因为当它在三个配对比较(a,x;b,y;c,z;等(中的任何一个中达到True时,它会导致True。因此,元组比较的工作方式更像是十进制值,而不是三个单独的标量变量。我需要所有三个配对比较(总共六个(的任何失败来产生 False 结果,而不是任何成功才能产生 True。
我希望有一个像 <= b <= c 这样简单易懂的方法。使用元组执行此操作的简单方法是什么,该方法仅在所有成对比较通过时才生成 True?
假设你的lower
和upper
绑定以及你的点是三元组,试试这个:
lower = 1,2,3
upper = 5,2,7
xyz = 2,3,4
all(u <= j <= v for u, j, v in zip(lower, xyz, upper))
或者只是单独比较它们:
(a <= x <= d) and (b <= y <= e) and (c <= z <= f)
根据Expression - Comparison
:
元组和列表使用相应元素的比较按字典顺序进行比较。
定义您自己的比较函数。
>>> def lte(x, y):
... return all(a <= b for a, b in zip(x, y))
...
>>> lte((1,2,3), (2,3,4))
True
>>> lte((1,2,3), (0,3,4))
False
>>> lte((1,2,3), (2,3,4)) and lte((2,3,4), (3,4,5))
True
>>> lte((1,2,3), (2,3,4)) and lte((2,3,4), (3,2,5))
False
通过反复试验和阅读这些论坛,我了解到 [...] 不起作用......
除了它,因为Python链接关系运算符。
>>> 3 < 4 < 5
True
>>> 5 > 4 > 3
True
这也不起作用,因为当它在三个配对比较中的任何一个中达到 True 时 [...],它会导致 True。
除了 Python 比较两个序列操作数(相同类型(中的所有元素。
>>> (1, 2, 3) >= (1, 2, 4)
False
请验证您实际上正在使用 Python,因为您的两个观察结果都是错误的。