从列表中删除索引,如果它包含特定的值
我正在寻找从列表中删除多个索引,并希望按内容对它们进行过滤。例如:从列表中删除索引,如果它包含特定的值
L= [(1, 2, 3), (etc, etc, etc), (......)]
if L[i] == 1:
L[i] == nan
>>>L
[(nan), (etc, etc.......]
我知道这个代码是不正确的,但它只是一个例子,帮助遍历了我想做的事,任何帮助表示赞赏,感谢。
您使用列表理解:
L = [float('nan') if el[0] == 1 else el for el in L]
的if .. else ..
部分称为conditional expression。
此用新列表替换列表。如果你有相同的列表多个引用,可以更换元素列表以代替片分配:
L[:] = [float('nan') if el[0] == 1 else el for el in L]
现在L
所有元素将与列表理解所产生的所有元素所取代。这两种表达方式之间的区别很微妙但很重要。第一次重新绑定L
指向一个新列表,第二个保留该列表,但仅替换列表本身中包含的元素。
如果你知道你正在检查的元素...
index_to_check = 3
if my_list[index_to_check] == bad_value:
del my_list[index_to_check]
L [:]将修改同一个列表。
这将检查项目是否包含1在第0个索引处,如果True
使用nan
否则使用该项目原样。
nan = float('nan')
L[:] = [nan if item[0] == 1 else item for item in L]
也许你正在试图做这样的事情的:
此检查,如果该项目包含1个在任何位置不只是零,如果真用别的楠使用该项目,因为它是。
L[:] = [nan if 1 in item else item for item in L]
如果你特别想删除它,我会建议一个过滤器:
filter(1, L)
如果你想做些别的事情与它列表理解将是最好的办法,但我不确定我是否应该遵循你的标题或你的榜样。
只要你在一个特定的值上进行筛选,而不是对lambda函数的评估,它应该比列表理解更有效。
如果你正在寻找一些更复杂的事情,那么列表理解将是最好的方法,因为lambda函数对这些应用程序不利。
replacement = float('nan')
condition = 1
L = [replacement if item == condition else item for item in L]
L = [replacement if item[index] == condition else item for item in L]
你可以融合多种解决方案,并通过改变上述例子中的一个,以这样的使用lambda功能,为您的条件:
replacement = float('nan')
condition = lambda x: x[0]==1
L = [replacement if condition(item) else item for item in L]
如果你很喜欢拉姆达功能,您甚至可以包住在lambda函数
custom_filter = lambda x: [float('nan') if item[0]==1 else item for item in x]
L = custom_filter(L)
这些解决方案是由性能粗糙为了整个事情,但它确实取决于你的具体应用和究竟你问题是。如果你想在很多不同的列表上使用它,即使custom_filter
对象具有额外的函数调用开销,可读性也会增加,如果连续多次使用它,性能差异将自动消失lambda函数会被缓存。
过滤器会尖叫得很快,但实际上没有其他方法那么灵活,第二种方法非常接近您的原始含义,但第三个例子可能是最模块化的,并且老实说我可能是解决方案只是因为它导致可读和通用的代码。