我正在运行一个数字列表的列表解析,例如,列表看起来像这样
vals = ['0.13', '324', '0.23432']
尝试这样的列表解析:
best = [x for x in vals > 0.02]
我得到一个TypeError:非序列上迭代。列表不应该是一个序列吗?它应该是你能够迭代的第一件事。什么是序列?很难找到我正在寻找的基本问题的答案。谢谢。
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'是布尔值,而不是序列,因此无法对其进行迭代。
[x for x in vals > '0.02']
[x for x in (vals > '0.02')]
vals > '0.02'
**EDIT:**根据Joe在评论中的建议,我更新了这个答案,使用字符串'0.02'(谢谢)。这在这个场景中是有效的,但是如果你真的想做一个数字比较,而不是字典比较,你可以用途:
'0.02'
best = [x for x in vals if float(x) > 0.02]
这将x转换为浮点数,这样你就可以比较一个浮点数和另一个浮点数,这可能是你想要的。列表解析的结果仍然是一个字符串列表,因为我们收集的是[x for ...]而不是[float(x) for ...]。
x
[x for ...]
[float(x) for ...]
mnowg1ta2#
不,vals > 0.02不完全是一个序列。另外,比较字符串(包含在变量中)不会产生预期的结果。您可能需要执行以下操作:
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]
虽然这看起来不多,但它提供了大量的特性和优点,您不希望错过使用数值数组和矩阵的机会。
tv6aics13#
您正在尝试迭代不是序列的vals > 0.02。如果您正在尝试过滤任何大于0.02的内容,请执行以下操作:[x for x in vals if x > 0.02]
0.02
[x for x in vals if x > 0.02]
hgc7kmma4#
你还有另一个问题(除了缺少if x〉0.02),你在比较一个字符串列表和一个浮点数。所以你可能需要[x for x in vals if x > '0.02']我已经测试过,这将给予你预期的行为。['324', '0.23432']
[x for x in vals if x > '0.02']
['324', '0.23432']
4条答案
按热度按时间zazmityj1#
您需要检查每个项目是否大于“0.02”,而不是序列是否更大。
原始表达式
[x for x in vals > '0.02']
被解析为[x for x in (vals > '0.02')]
。由于vals > '0.02'
是布尔值,而不是序列,因此无法对其进行迭代。**EDIT:**根据Joe在评论中的建议,我更新了这个答案,使用字符串
'0.02'
(谢谢)。这在这个场景中是有效的,但是如果你真的想做一个数字比较,而不是字典比较,你可以用途:这将
x
转换为浮点数,这样你就可以比较一个浮点数和另一个浮点数,这可能是你想要的。列表解析的结果仍然是一个字符串列表,因为我们收集的是[x for ...]
而不是[float(x) for ...]
。mnowg1ta2#
不,
vals > 0.02
不完全是一个序列。另外,比较字符串(包含在变量中)不会产生预期的结果。您可能需要执行以下操作:话虽如此,但一定要看一下NumPy,它允许您将示例编写为:
虽然这看起来不多,但它提供了大量的特性和优点,您不希望错过使用数值数组和矩阵的机会。
tv6aics13#
您正在尝试迭代不是序列的
vals > 0.02
。如果您正在尝试过滤任何大于0.02
的内容,请执行以下操作:[x for x in vals if x > 0.02]
hgc7kmma4#
你还有另一个问题(除了缺少if x〉0.02),你在比较一个字符串列表和一个浮点数。
所以你可能需要
[x for x in vals if x > '0.02']
我已经测试过,这将给予你预期的行为。
['324', '0.23432']