使用默认回退选项筛选列表值



给定 2 个数字列表:

real_solutions_sols1 =  [-53.2909210236, -8.31658000998, 1.87689837129, 1.4]
real_solutions_sols2 =  [-21.1439685227, -19.2]

我希望使用相同的代码重写列表,以便它们包含0.14.0之间的数字:

real_solutions_sols1 =  [ 1.87689837129, 1.4]

对于第二个列表,这是不可能的,所以我希望代码返回完整的列表:

real_solutions_sols2 =  [-21.1439685227, -19.2]

以下代码适用于real_solutions_sols2

real_roots_zero_to_four = []
for i in real_solutions_sols2:
if (i >= 0.1) and (i <= 4.0):
real_roots_zero_to_four.append(i)
else:
real_roots_zero_to_four = real_solutions_sols2
print 'real_roots_zero_to_four = ', real_roots_zero_to_four

不满足if条件,因此我们跳到else语句。

real_roots_zero_to_four = [-21.14396852, -19.2]

但是,对于第一个列表,它是无限循环的:

real_roots_zero_to_four = []
for i in real_solutions_sols1:
if (i >= 0.1) and (i <= 4.0):
real_roots_zero_to_four.append(i)
else:
real_roots_zero_to_four = real_solutions_sols1
print 'real_roots_zero_to_four = ', real_roots_zero_to_four

我不确定为什么会发生这种情况

您可以使用以下习惯用法\架构:

my_list = [x for x in my_list if 0.1 <= x <= 4] or my_list

这里发生的事情是,我们正在利用逻辑or的工作方式与 Python 中列表的布尔性质相结合。

详细地说,假设我们有:

<exp 1> or <exp 2>

Python 解释器将首先评估or左侧内容的真实。如果该检查返回True,则返回<exp 1>(不是True)。否则,无论不检查其真实性值如何,都会返回<exp 2>。利用bool([])返回False的事实,我们可以确定,如果我们的列表推导返回一个空列表,则将返回or的右侧(原始列表my_list)。

因此,我们正在做的是优雅地说以下内容:

给定my_list,获取满足if条件的所有元素,除非没有任何元素,在这种情况下只需返回原始元素。


代码中的问题是使用&这并不意味着在 Python 中and逻辑ANDand所以你应该做if (i >= 0.1) and (i <= 4.0):

最后,请注意,在 Python 中,像i >= 0.1 and i <= 4.0这样的表达式可以"压缩"成0.1 <= i <= 4.0(就像你在数学课上写的那样)。

我只是要指出无限 for 循环的原因,因为当我们分配real_roots_zero_to_four = real_solutions_sols1

您正在执行浅拷贝,这意味着我们指的是变量的同一副本,即它们是指向同一块内存的指针

然后当你这样做时

if (i >= 0.1) & (i <= 4.0):
real_roots_zero_to_four.append(i)

您正在追加到real_roots_zero_to_fourreal_solutions_sols1

然后我们在 forloop 中的同一位置循环

for i in real_solutions_sols1:

因为它们指向同一件事,然后我们检查相同的内容 元素并无限添加,直到系统崩溃

为了在另一个列表上运行追加,我们必须做一个可以使用

real_roots_zero_to_four =list( real_solutions_sols1 )

那么就不会再有无限的forloop了

@Ev给出的答案。库尼斯无疑是解决您问题的最佳解决方案。但是,我认为看看为什么您的代码不起作用很有趣。罪魁祸首在这里:

real_roots_zero_to_four = real_solutions_sols1

当满足else语句时,将执行上述行,并将对real_solutions_sols1的引用复制到real_roots_zero_to_four从现在开始,附加到real_roots_zero_to_four的所有值也会附加到real_solutions_sols1

从这里开始,无限循环。

使用列表理解:

result = [x for x in [-53.2909210236, -8.31658000998, 1.87689837129, 1.4] if x >= 0.1 and x <=4.0]
print(result)
# [1.87689837129, 1.4]

顺便说一句,你为什么使用&作为逻辑AND?它是用Python编写的:

if i >= 0.1 and i <= 4.0:

最新更新