最快的方法是什么?我有一个列表列表,我必须遍历它,寻找每个子列表上的特定值。找到值后,我必须将值附加到另一个单独的列表,然后更改我找到的值。我开始这样做了
for x in f
if 'nan' in x:
ef.append(1.0)
else:
ef.append(0.0)
f是列表列表,因此我遍历每个列表x并检查子列表中元素之间是否存在nan值。如果子列表中的元素中至少有一个纳米值,则我将1.0附加到ef,但如果不存在,则附加0.0。现在我需要这样做,但同时我必须将每个子列表上的所有nan值更改为1.0。所以我想做一些像
这样的事情for x in f:
if 'nan' in x:
ef.append(1.0)
x[position of nans] = 1.0
else:
ef.append(0.0)
有没有办法在这个循环中执行此操作或必须重新循环?我处理的是非常大量的数据,所以我希望尽可能快地保存它。
答案 0 :(得分:2)
这样的事情的复杂性是线性的,你做得不好,因为你需要至少检查一次每个元素。假设您想在每个子列表中仅在1
列表中附加0
或ef
,则此类内容将起作用:
f = [[1, 'nan'], [2, 'nan', 'nan']]
ef = []
for x in f:
found = False
for pos, e in enumerate(x):
if e == 'nan':
x[pos] = 1
found = True
ef.append(1 if found else 0)
print f, ef
我的笔记本电脑上的计时(包括构建列表):
$ time python test.py
numElements = 15000000
real 0m1.908s
user 0m1.879s
sys 0m0.028s
答案 1 :(得分:0)
而不是使用list.append(),使用列表解析初始化一次更快:
ef = [[item if item != 'nan' else 1 for item in list] for list in f]
这避免了在每次插入后必须找到列表的末尾,并且更美观。