给定 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
我不确定为什么会发生这种情况
您可以使用以下习惯用法\架构:
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
。逻辑AND
是and
所以你应该做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_four
和real_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: