3

我正在运行将数字列表作为字符串的列表理解,因此例如列表看起来像这样

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

并尝试这样的列表理解:

best = [x for x in vals > 0.02]

我得到一个 TypeError: 非序列迭代。

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

很难找到我正在寻找的基本问题的答案。

谢谢。

4

4 回答 4

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为浮点数,以便您将浮点数与另一个浮点数进行比较,可能符合预期。列表推导的结果仍然是一个字符串列表,因为我们正在收集[x for ...]而不是[float(x) for ...]. 只是一些思考的食物。

于 2011-02-17T01:08:51.670 回答
4

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

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]

虽然这可能看起来不多,但它提供了许多您不想错过使用数值数组和矩阵的特性和优势。

于 2011-02-17T01:14:58.217 回答
2

您正在尝试迭代vals > 0.02哪个不是序列。如果您尝试过滤任何内容 >0.02执行以下操作: [x for x in vals if x > 0.02]

于 2011-02-17T01:08:55.070 回答
1

您还有另一个问题(除了缺少 if x > 0.02),您正在将字符串列表与浮点数进行比较。

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

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

于 2011-02-17T01:14:45.993 回答