【问题标题】:how is this a non-sequence?这怎么是非序列?
【发布时间】:2011-02-17 01:07:34
【问题描述】:

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

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

并尝试这样的列表理解:

best = [x for x in vals > 0.02]

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

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

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

谢谢。

【问题讨论】:

  • 你用哪个教程来学习 Python?
  • @user365930:您可以详细说明您的总体目标。正如 Jim Brissom 指出的那样,numpy 可能是适合您的工具(只是假设是因为您如何编写 best= [... vals> 0.02]。所以请提供更多上下文以获得更多相关答案。谢谢

标签: python list sequences list-comprehension


【解决方案1】:

你需要检查每个项目是否大于'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' 是布尔值,而不是序列,因此无法对其进行迭代。

编辑:我根据 Joe 在 cmets 中的建议更新了这个答案以使用字符串 '0.02'(谢谢)。这在这种情况下有效,但如果您真的想要进行数字比较而不是字典比较,您可以使用:

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

这会将x 转换为浮点数,以便您将浮点数与另一个浮点数进行比较,这可能符合预期。列表理解的结果仍然是字符串列表,因为我们收集的是[x for ...] 而不是[float(x) for ...]。只是一些思考的食物。

【讨论】:

  • 这将给出 ['0.13', '324', '0.23432'] 作为答案。还有另一个问题,OP 将字符串与浮点数进行比较,因此它们都是 True。您需要在 '0.02' 周围加上引号或将 vals 转换为浮点数列表。
【解决方案2】:

不,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]

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

【讨论】:

    【解决方案3】:

    您正在尝试迭代不是序列的vals > 0.02。如果你想过滤任何东西 > 0.02 做:[x for x in vals if x > 0.02]

    【讨论】:

      【解决方案4】:

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

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

      我已经测试过,这将为您提供预期的行为。 ['324', '0.23432']

      【讨论】:

        猜你喜欢
        • 2017-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-22
        • 2020-05-25
        • 2018-11-06
        • 2011-07-06
        • 1970-01-01
        相关资源
        最近更新 更多