我想生成一个如下所示的列表:
['ret-120','ret-115','ret-110',....'ret-5','ret5',....'ret240']
请注意,列表中没有ret0
元素。所以我必须从范围函数填充的列表中删除它。我试过了:
['ret'+str(x) for x in list(range(-120,241,5)).remove(0)]
但是这会产生错误:
TypeError: 'NoneType' object is not iterable
这可以用一行代码完成吗?
答案 0 :(得分:3)
执行所需操作的最简单方法是在列表解析中添加条件:
lst = ['cumRet'+str(x) for x in xrange(-120,241,5) if x != 0]
# This part: ^^^^^^^^^
我还删除了不必要的列表创建并更改了range
- > xrange
(请注意,此range
- > xrange
更改仅限Python2)
答案 1 :(得分:2)
您的NoneType
错误是因为list.remove(index)
就地修改,因此会返回None
。
因此,您正在尝试循环[for x in None]
。
2行备用方式(;
)
tmp = list(range(-120,241,5));tmp.remove(0)
['ret'+str(x) for x in list(range(-120,241,5)).remove(0)]
答案 2 :(得分:0)
remove()返回无
列表remove()
方法返回None
,所以'NoneType'对象不可迭代。
演示:
>>> b = list(range(-120,241,5)).remove(0)
>>> b
>>> print b
None
我们将创建列表变量,然后从中删除0
。
演示:
>>> tmp = list(range(-120,241,5))
>>> tmp.remove(0)
>>> ['cumRet'+str(x) for x in tmp]
['cumRet-120', 'cumRet-115', 'cumRet-110', 'cumRet-105', 'cumRet-100', 'cumRet-95', 'cumRet-90', 'cumRet-85', 'cumRet-80', 'cumRet-75', 'cumRet-70', 'cumRet-65', 'cumRet-60', 'cumRet-55', 'cumRet-50', 'cumRet-45', 'cumRet-40', 'cumRet-35', 'cumRet-30', 'cumRet-25', 'cumRet-20', 'cumRet-15', 'cumRet-10', 'cumRet-5', 'cumRet5', 'cumRet10', 'cumRet15', 'cumRet20', 'cumRet25', 'cumRet30', 'cumRet35', 'cumRet40', 'cumRet45', 'cumRet50', 'cumRet55', 'cumRet60', 'cumRet65', 'cumRet70', 'cumRet75', 'cumRet80', 'cumRet85', 'cumRet90', 'cumRet95', 'cumRet100', 'cumRet105', 'cumRet110', 'cumRet115', 'cumRet120', 'cumRet125', 'cumRet130', 'cumRet135', 'cumRet140', 'cumRet145', 'cumRet150', 'cumRet155', 'cumRet160', 'cumRet165', 'cumRet170', 'cumRet175', 'cumRet180', 'cumRet185', 'cumRet190', 'cumRet195', 'cumRet200', 'cumRet205', 'cumRet210', 'cumRet215', 'cumRet220', 'cumRet225', 'cumRet230', 'cumRet235', 'cumRet240']
>>>
异常处理:
当我们从列表中删除元素时执行Exception Handling
的最佳做法,因为如果列表中没有元素,那么它将引发ValueError
异常。
演示:
>>> l = [4,6,8]
>>> l.remove(3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
>>>
>>> try:
... l.remove(3)
... except ValueError:
... print "List not contains remove element."
...
List not contains remove element.
>>>
答案 3 :(得分:0)
问题是,list.remove()
方法会就地更改列表并有效地返回None
,但是当它为零时,您可以跳过x
:
['ret'+str(x) for x in range(-120, 241, 5) if x]
如果你正在使用Python 2,range()
可以更改为xrange()
,这将避免创建所有整数值的临时列表。