Python 使用默认的回退选项筛选列表值

Python 使用默认的回退选项筛选列表值,python,list,for-loop,if-statement,append,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.1和4.0之间的数字: real_solutions_sols1 = [ 1.87689837129, 1.4] 对于第二个列表,这是不可能的,因此我希望代码返回完整的列表: r

给定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\u solutions\u 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

我不知道为什么会发生这种情况

使用列表理解:

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]

您可以使用以下惯用语\schema:

my_list = [x for x in my_list if 0.1 <= x <= 4] or my_list
Python解释器将首先评估
左侧上任何内容的真实性。如果该检查返回
True
,则返回
True
)。否则,将返回
,而不考虑其未检查的真实性值。利用
bool([])
返回
False
这一事实,我们可以确定,如果我们的列表理解返回一个空列表,那么
的右侧将返回(原始列表
我的列表

因此,我们所做的是优雅地说:

给定
my_list
,获取满足
if
条件的所有元素,除非没有任何元素,否则只返回原始元素



代码中的问题是使用了
&
,而在Python中并不意味着
。逻辑上的
因此,如果(i>=0.1)和(i=0.1和i我只想指出无限for循环的原因,因为当我们将
实根\u 0\u分配给四个=实解\u sols1时

你正在做一个浅拷贝这意味着我们引用的是变量的同一拷贝,即它们是指向同一内存块的指针

当你这样做的时候

if (i >= 0.1) & (i <= 4.0):
     real_roots_zero_to_four.append(i)
因为它们指向相同的东西,然后我们检查相同的东西 元素并无限添加它,直到系统崩溃

为了在另一个列表上运行append,我们必须进行深度复制 可以使用

real_roots_zero_to_four =list( real_solutions_sols1 )

这样就不会再有无限的forloops了,@Ev给出的答案。Kounis无疑是解决您问题的最佳解决方案。不过,我想看看为什么您的代码不起作用是很有趣的。罪魁祸首在这里:

real_roots_zero_to_four = real_solutions_sols1
当满足
else
语句时,执行上述行,并复制
real\u sols1
real\u roots\u zero\u to\u four
中的引用
real\u roots\u zero\u to\u four
中。从现在起,所有附加到
real\u sols1\u sols1的值都被附加到
real\u sols1
也是


从这里开始,无限循环。

对不起,我确实看到了(可能)解决了OP代码中的问题,但您可能希望重写并解释为什么使用
&
不会产生语法错误,但仍然给出错误的答案。正确的,我为实际问题添加了一个解决方案。是的,这绝对是我的最爱。您可能希望添加一个关于python
0.1
中的有效状态的说明t和how
不一样thing@Ev.Kounis感谢您的回答。您的列表理解方法非常优雅,我非常欣赏。但是,我试图理解为什么那些
for
if
循环不起作用:请注意,如果我用
替换
&
,我仍然得到一个无限循环。你能帮我理解上面代码中的问题在哪里吗?再次感谢所有的帮助effort@DavidC.Because每次遇到不符合条件的数字时,您都会覆盖
实根\u 0\u到\u 4
。不知道如何向您解释这一点。请尝试遵循看看代码,一次又一次的迭代,你会看到的。@DavidC。好吧,这不是在这种情况下,而是无论如何。@Nick A谢谢你的评论。在我看来,我认为这些链接不是重复的,因为正如在帖子中所说的,在用
替换
&
之后,问题仍然存在。正如正如Ev.Kounis正确指出的,这是一个合乎逻辑的问题,已经在文章标题中编辑过。那很好,它只是一个可能的重复,而不是确定的,我已经删除了评论,你似乎得到了一个很好的答案,所以没有造成伤害:)谢谢你的评论谢谢你的解释
if (i >= 0.1) & (i <= 4.0):
     real_roots_zero_to_four.append(i)
for i in real_solutions_sols1:
real_roots_zero_to_four =list( real_solutions_sols1 )
real_roots_zero_to_four = real_solutions_sols1