使用默认后备选项筛选列表值

时间:2018-01-24 13:38:55

标签: python list for-loop if-statement append

给出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

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

4 个答案:

答案 0 :(得分:7)

您可以使用以下idiom \ schema:

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条件的所有元素,除非在任何情况下都没有返回原始元素。

您的代码中的问题是使用&,其中意味着and在Python中。逻辑ANDand,因此您应该if (i >= 0.1) and (i <= 4.0):

最后请注意,在Python中,像i >= 0.1 and i <= 4.0这样的表达式可以“压缩”到0.1 <= i <= 4.0中(就像你在Math类中编写的那样)。

答案 1 :(得分:2)

我只想指出无限循环的原因,因为当我们分配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 )

然后不再有无限的forloops

答案 2 :(得分:1)

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

real_roots_zero_to_four = real_solutions_sols1

当满足else语句时,执行上述行,real_solutions_sols1内的参考复制 <{1}} 。从现在开始,real_roots_zero_to_four附加的所有值也会附加到real_roots_zero_to_four

从这里开始,无限循环。

答案 3 :(得分:0)

使用列表理解:

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]

BTW,为什么你使用&作为逻辑AND?这是用Python编写的:

if i >= 0.1 and i <= 4.0: