python 这怎么会是无序?

g52tjvyc  于 2023-01-29  发布在  Python
关注(0)|答案(4)|浏览(105)

我正在运行一个数字列表的列表解析,例如,列表看起来像这样

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

尝试这样的列表解析:

best = [x for x in vals > 0.02]

我得到一个TypeError:非序列上迭代。
列表不应该是一个序列吗?它应该是你能够迭代的第一件事。什么是序列?
很难找到我正在寻找的基本问题的答案。
谢谢。

zazmityj

zazmityj1#

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

**EDIT:**根据Joe在评论中的建议,我更新了这个答案,使用字符串'0.02'(谢谢)。这在这个场景中是有效的,但是如果你真的想做一个数字比较,而不是字典比较,你可以用途:

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

这将x转换为浮点数,这样你就可以比较一个浮点数和另一个浮点数,这可能是你想要的。列表解析的结果仍然是一个字符串列表,因为我们收集的是[x for ...]而不是[float(x) for ...]

mnowg1ta

mnowg1ta2#

不,vals > 0.02不完全是一个序列。另外,比较字符串(包含在变量中)不会产生预期的结果。您可能需要执行以下操作:

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]

虽然这看起来不多,但它提供了大量的特性和优点,您不希望错过使用数值数组和矩阵的机会。

tv6aics1

tv6aics13#

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

hgc7kmma

hgc7kmma4#

你还有另一个问题(除了缺少if x〉0.02),你在比较一个字符串列表和一个浮点数。
所以你可能需要[x for x in vals if x > '0.02']
我已经测试过,这将给予你预期的行为。['324', '0.23432']

相关问题