给出2个数字列表:
real_solutions_sols1 = [-53.2909210236, -8.31658000998, 1.87689837129, 1.4]
real_solutions_sols2 = [-21.1439685227, -19.2]
我希望使用相同的代码重写列表,使其包含0.1
和4.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
我不确定为什么会发生这种情况
答案 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中。逻辑AND
为and
,因此您应该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_four
和real_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: