我正在运行将数字列表作为字符串的列表理解,因此例如列表看起来像这样
vals = ['0.13', '324', '0.23432']
并尝试这样的列表理解:
best = [x for x in vals > 0.02]
我得到一个 TypeError: 非序列迭代。
列表不应该是您应该能够迭代的第一件事吗?什么是序列?
很难找到我正在寻找的基本问题的答案。
谢谢。
我正在运行将数字列表作为字符串的列表理解,因此例如列表看起来像这样
vals = ['0.13', '324', '0.23432']
并尝试这样的列表理解:
best = [x for x in vals > 0.02]
我得到一个 TypeError: 非序列迭代。
列表不应该是您应该能够迭代的第一件事吗?什么是序列?
很难找到我正在寻找的基本问题的答案。
谢谢。
您需要检查每个项目是否大于'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 ...]
. 只是一些思考的食物。
不,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]
虽然这可能看起来不多,但它提供了许多您不想错过使用数值数组和矩阵的特性和优势。
您正在尝试迭代vals > 0.02
哪个不是序列。如果您尝试过滤任何内容 >0.02
执行以下操作: [x for x in vals if x > 0.02]
您还有另一个问题(除了缺少 if x > 0.02),您正在将字符串列表与浮点数进行比较。
所以你可能想要的是[x for x in vals if x > '0.02']
我已经测试过这会给你预期的行为。['324', '0.23432']