这怎么不是一个序列?

3 投票
4 回答
2232 浏览
提问于 2025-04-16 11:58

我正在对一个数字字符串的列表进行列表推导,比如这个列表看起来是这样的:

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

然后我尝试了这样的列表推导:

best = [x for x in vals > 0.02]

结果我遇到了一个类型错误:无法对非序列进行迭代。

难道列表不是一种序列吗?应该是可以首先进行迭代的东西吧?那么,什么是序列呢?

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

谢谢。

4 个回答

2

你正在尝试遍历 vals > 0.02,但这不是一个可以逐个访问的序列。如果你想筛选出所有大于 0.02 的值,可以这样做:[x for x in vals if x > 0.02]

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]

虽然这看起来没什么特别的,但它提供了很多功能和优势,让你在处理数字数组和矩阵时不会错过。

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 ...]。这只是给你一些思考的方向。

撰写回答