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

Dav*_*dC. 1 python for-loop if-statement list append

给出2个数字列表:

real_solutions_sols1 =  [-53.2909210236, -8.31658000998, 1.87689837129, 1.4]
real_solutions_sols2 =  [-21.1439685227, -19.2]
Run Code Online (Sandbox Code Playgroud)

我想相同的代码重写名单,使它们包含之间数字0.14.0:

real_solutions_sols1 =  [ 1.87689837129, 1.4]
Run Code Online (Sandbox Code Playgroud)

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

real_solutions_sols2 =  [-21.1439685227, -19.2]
Run Code Online (Sandbox Code Playgroud)

以下代码适用于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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我不确定为什么会这样

Ev.*_*nis 7

您可以使用以下idiom\schema:

my_list = [x for x in my_list if 0.1 <= x <= 4] or my_list
Run Code Online (Sandbox Code Playgroud)

这里发生的是我们利用逻辑or工作的方式结合Python中列表的布尔性质.

详细地说,假设我们有:

<exp 1> or <exp 2>
Run Code Online (Sandbox Code Playgroud)

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类中编写的那样).