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.1和4.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)
我不确定为什么会这样
您可以使用以下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中.相反,逻辑AND是and如此,你应该这样做if (i >= 0.1) and (i <= 4.0):
最后,请注意在Python表达式i >= 0.1 and i <= 4.0中可以"浓缩"成0.1 <= i <= 4.0(如在Math类中编写的那样).