Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:循环遍历与值匹配的列表并对其进行更改_Python_List_Loops - Fatal编程技术网

Python:循环遍历与值匹配的列表并对其进行更改

Python:循环遍历与值匹配的列表并对其进行更改,python,list,loops,Python,List,Loops,最快的方法是什么?我有一个列表列表,我必须在其中循环查找每个子列表上的特定值。一旦找到值,我必须将一个值附加到另一个单独的列表中,然后更改找到的值。我开始这样做 for x in f if 'nan' in x: ef.append(1.0) else: ef.append(0.0) f是列表列表,因此我循环遍历每个列表x,并检查子列表的元素之间是否有nan值。如果子列表x的元素中至少有一个nan值,我会将1.0追加到ef,但如果没有,我会追加0

最快的方法是什么?我有一个列表列表,我必须在其中循环查找每个子列表上的特定值。一旦找到值,我必须将一个值附加到另一个单独的列表中,然后更改找到的值。我开始这样做

for x in f
    if 'nan' in x:
        ef.append(1.0)
    else:
        ef.append(0.0)
f是列表列表,因此我循环遍历每个列表x,并检查子列表的元素之间是否有nan值。如果子列表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)

有没有办法在这个循环中实现这一点,或者我必须再次循环?我正在处理大量的数据,所以我希望尽可能快地保存这些数据。

像这样的事情的复杂性是线性的,你不能做得更好,因为你需要至少检查每个元素一次。假设您只想在
ef
列表中为每个子列表添加一次
1
0
,类似的操作将起作用:

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
这个

在我的笔记本电脑上计时(包括建立列表):


与使用list.append()不同,使用列表理解进行初始化更快:

ef = [[item if item != 'nan' else 1 for item in list] for list in f]

这避免了在每次插入后都必须找到列表的结尾,而且更加美观

呵呵,对不起,我稍微改变了你的例子,因为在问题中,对于
f
中包含
'nan'
的每个条目,只有一个
1
附加到
ef
,而不是每个
'nan'
:Thx,是的,很公平,我不清楚何时需要附加1。不过,我认为OP自己也能弄明白,问题更多的是是否有更快的方法@是的,谢谢。上面的海报是对的,但你的回答确实帮助了我。我对措辞做了一点修改以使其更清楚。@paul-g感谢您向我展示ideone btw,这非常有用@Atirag好的,我更新了答案,每个子列表只追加一次?:)六羟甲基三聚氰胺六甲醚。。。但是这个项目从来没有从nan变为1,对吗?每次找到nan时,我需要将在子列表中找到的项更改为1,并且可以在每个列表中的许多不同项上找到nan。ef每个子列表只应包含一个条目,而不是每个找到的nan
ef = [[item if item != 'nan' else 1 for item in list] for list in f]