Python 使用默认的回退选项筛选列表值
给定2个编号列表: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
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代码中的问题,但您可能希望重写并解释为什么使用&
不会产生语法错误,但仍然给出错误的答案。正确的,我为实际问题添加了一个解决方案。是的,这绝对是我的最爱。您可能希望添加一个关于python0.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