从可变大小的数组创建 IF 语句

时间:2021-01-12 01:53:05

标签: python python-3.x if-statement

我有一个 lnprior 函数,它应该根据我想要适合的参数进行更改,而有些则保持固定。假设我有

p0 = [1,20]
p1 = [[0,2],[10,30]]

基本上我有:

a, b = p0
a_, b_ = p1
if (a_[0] < a < a_[1]) and (b_[0] < b < b_[1]):

然而,p0p1 可以有一个变化的维度,例如

p0 = [1,20, 300]
p1 = [[0,2],[10,30],[200, 400]]

在这种情况下,IF 条件应该是:

a, b, c = p0
a_, b_, c_ = p1
if (a_[0] < a < a_[1]) and (b_[0] < b < b_[1]) and (c_[0] < c < c_[1])

有没有办法根据p0的大小自动创建IF语句(在我的实际代码中p0是一个字典,可能更容易操作)?

2 个答案:

答案 0 :(得分:1)

类似于 Selcuk's answer,但我认为更具可读性:

all(low < value < high for value, (low, high) in zip(p0, p1))

这会压缩列表以将值与其上限和下限相关联,然后遍历所有对并测试 value 是否介于 lowhigh 值之间。 all() 确保所有值都在各自的范围内。

>>> p0 = [1, 20, 300]
>>> p1 = [[0, 2], [10, 30], [200, 400]]
>>> all(low < value < high for value, (low, high) in zip(p0, p1))
True

>>> p0 = [1, 10, 300]
>>> all(low < value < high for value, (low, high) in zip(p0, p1))
False
>>> 

答案 1 :(得分:0)

是的。不要手动解压 p0p1,而是使用带有 generator expressionall()

if all(p1[i][0] < p0[i] < p1[i][1] for i in range(len(p0))):
    ...