从列表中删除索引,如果它包含特定的值

问题描述:

我正在寻找从列表中删除多个索引,并希望按内容对它们进行过滤。例如:从列表中删除索引,如果它包含特定的值

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函数会被缓存。

过滤器会尖叫得很快,但实际上没有其他方法那么灵活,第二种方法非常接近您的原始含义,但第三个例子可能是最模块化的,并且老实说我可能是解决方案只是因为它导致可读和通用的代码。