使用PYTHON 3.我想在LOOP中创建一个新列表(浮点数),而不更改列表的名称,这将删除所有的负数或零元素,最终改变其长度。谁是最快的方法呢?我失去了试图做最后几天......
(UPDATE)
示例:
import math
l= [0.]*10
for i in range(1,10):
l[i] = math.sin(i)
l = [x for x in l if x > 0]
print(i, l[i])
仍然无法正常工作......
答案 0 :(得分:2)
我可以给你的一种方式:
new_list = [x for x in yourlist if not x <= 0 ]
我试过了:
>>> yourlist = [1, -2 , 0 , 3.9 , 4 , -5.8, -3.0 ]
>>> new_list = [x for x in yourlist if not x <= 0 ]
>>> print new_list
[1, 3.9, 4]
编辑:
第二种方法:
L = [1, -2 , 0 , 3.9 , 4 , -5.8, -3.0 ]
out = []
for i in L[:]:
if i > 0:
out.append(i)
print out
<强> EDIT2:强>
当你评论我的回答时,可能你需要这个:
第三种方式:
L = [1, -2 , 0 , 3.9 , 4 , -5.8, -3.0 ]
for obj in L[:]:
if obj <= 0:
del L[L.index(obj)]
print L
EDIT3 (更新)代码错误
在您的代码中:
import math
l= [0.]*10
for i in range(1,10):
l[i] = math.sin(i)
l = [x for x in l if x > 0]
print(i, l[i])
您在此IndexError
行获得了print(i, l[i])
。因为for-loop
后i
的值变为9
。在print语句之前删除列表l = [x for x in l if x > 0]
中的一些元素,因此列表l
的大小尖叫到少于&lt;值i
。并且在print(i, l[i])
中,您试图在i
位置错误索引!
你想要什么?如果要打印列表中的最后一个元素,请执行以下操作:
print(i, l[len(l)-1])
答案 1 :(得分:1)
my_list = [i for i in my_list if i>0]
答案 2 :(得分:0)
有两种方法可以轻松过滤迭代中的元素:
output = [i for i in input if i > 0]
或:
output = filter(lambda i: i > 0, input)
请注意,[filter(function, iterable)
] [1]返回一个迭代器,如果需要列表对象,只需执行output = list(output)
之类的操作。
答案 3 :(得分:0)
假设我们有一个列表l = [-2, -1.4, 0, 1, 2.2, 3]
第一种方法是简单地使用列表理解,并设置列表名称以引用创建的新列表。
l = [i for i in l if i > 0]
另一种方法是遍历列表的副本,并删除小于或等于0的元素:
for i in l[:]:
if i <= 0:
l.remove(i)
无论哪种方式,结果都是[1, 2.2, 3]
编辑到您的更新:
import math
l = []
for i in range(1, 10):
v = math.sin(i)
if v > 0:
l.append(i)
for v in l:
print(v)
将所有带0或负罪的数字遗漏,导致:
0.841470984808
0.909297426826
0.14112000806
0.656986598719
0.989358246623
0.412118485242
EDIT2 如果您还需要原始号码,我会使用词典:
import math
d = {}
for i in range(1, 10):
v = math.sin(i)
if v > 0:
d[i] = v
for k in d:
print(k, d[k])
或元组:
import math
l = []
for i in range(1, 10):
v = math.sin(i)
if v > 0:
l.append((i, v))
for t in l:
print(t[0], t[1])
这将导致:
1 0.8414709848078965
2 0.9092974268256817
3 0.1411200080598672
7 0.6569865987187891
8 0.9893582466233818
9 0.4121184852417566