这是一个非序列吗?

3
我正在运行一个列表推导式,对数字列表进行操作,这些数字以字符串形式表示,例如列表如下:
vals = ['0.13', '324', '0.23432']

尝试使用类似这样的列表推导式:

best = [x for x in vals > 0.02]

当我尝试迭代一个非序列对象时,出现了TypeError: iteration over non-sequence的错误。

列表不是应该是您首先要能够迭代的序列吗?什么是序列?

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

谢谢。


2
您正在使用哪个教程学习Python? - Greg Hewgill
@user365930:您可以更详细地阐述一下您的总体目标。正如Jim Brissom所指出的那样,numpy可能是适合您的正确工具(仅仅是因为您写了best=[...vals>0.02])。因此,请提供更多上下文以获得更相关的答案。谢谢。 - eat
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'是一个布尔值,而不是一个序列,因此无法迭代它。 编辑:我根据Joe在评论中的建议更新了这个答案,使用了字符串'0.02'(谢谢)。这在这种情况下有效,但如果您真的想进行数值比较而不是词典排序,则可以使用:
best = [x for x in vals if float(x) > 0.02]

这将x转换为浮点数,以便您将一个浮点数与另一个浮点数进行比较,这可能是预期的结果。列表推导式的结果仍将是字符串列表,因为我们正在收集[x for ...]而不是[float(x) for ...]。只是一些值得思考的东西。


2
这将返回 ['0.13','324','0.23432'] 作为答案。另一个问题是,OP正在使用字符串与浮点数进行比较,因此它们都将为True。您需要在“0.02”周围加上引号或将vals转换为浮点数列表。 - Joe

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]

虽然这看起来不太显眼,但它提供了许多功能和优势,您在使用数字数组和矩阵时不想错过。

2

您正在尝试迭代vals > 0.02,这不是一个序列。如果您想要筛选只有大于0.02的任何东西,请执行:[x for x in vals if x > 0.02]


1

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接