2011-02-17 42 views
3

我正在为字符串编号列表的列表理解所以例如表看起来是这是一个非序列?

vals = ['0.13', '324', '0.23432'] 

,并尝试列表理解是这样的:

best = [x for x in vals > 0.02] 

,我也得到一个TypeError:对非序列进行迭代。

是不是一个列表应该是你应该能够迭代的第一件事?什么是序列?

很难找到我发现的基本问题的答案。

谢谢。

+2

你正在使用哪个教程来学习Python? – 2011-02-17 01:10:50

+0

@ user365930:您可以详细阐述我们的总体目标。正如Jim Brissom所指出的`numpy`可能是您正确的工具(因为您如何编写`best = [... vals> 0.02]`,所以请提供更多的上下文以获得更相关的答案。谢谢 – eat 2011-02-17 01:24:29

回答

8

您需要检查每个项目是否大于'0.02',而不是序列是否更大。

best = [x for x in vals if x > '0.02'] 

你的原始表达式,[x for x in vals > '0.02']被解析为[x for x in (vals > '0.02')]。由于vals > '0.02'是一个布尔值,而不是一个序列,所以不可能遍历它。

编辑:我更新了这个答案,使用字符串'0.02'每个乔的建议在评论(谢谢)。这一工程在这种情况下,但你真的想做一个数字比较,而不是字典一个事件,你可以使用:

best = [x for x in vals if float(x) > 0.02] 

这种转换x为float让您比较一个浮点指向另一个浮点数的数字,可能如预期的那样。列表理解的结果仍然是字符串列表,因为我们正在收集[x for ...]而不是[float(x) for ...]。只是一些思考的食物。

2

您正试图迭代vals > 0.02这不是一个序列。如果你想过滤到任何东西>0.02做:[x for x in vals if x > 0.02]

1

你也有另一个问题(除了缺少如果x> 0.02),你正在比较一个字符串列表与浮动。

所以你可能想要的是[x for x in vals if x > '0.02']

我测试过,这会给你的预期行为。 ['324', '0.23432']

4

不,vals > 0.02不完全是一个序列。而且,比较字符串(包含在val中)不会产生您期望的结果。你可能想要做的:

vals = [0.13, 324.0, 0.23432] 
best = [x for x in vals if x > 0.02] 

话虽这么说,一定要看一看NumPy。它可以让你写你的例子如:

from numpy import * 
vals = asarray([0.13, 324.0, 0.23432]) 
best = vals[vals > 0.02] 

虽然这可能似乎并不多,它提供了你不想错​​过与数字阵列和矩阵的工作特点和优点太多了。

相关问题