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

时间:2013-06-25 14:48:22

标签: python list

我希望从列表中删除多个索引,并希望按内容过滤它们。例如:

L= [(1, 2, 3), (etc, etc, etc), (......)]
if L[i] == 1:
    L[i] == nan
>>>L
[(nan), (etc, etc.......]

我知道这段代码不正确,但这只是一个帮助迭代我想做的事情的例子,感谢任何帮助。谢谢。

4 个答案:

答案 0 :(得分:2)

您使用列表理解:

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以指向新列表,第二个保留该列表但仅替换列表中包含的元素。

答案 1 :(得分:2)

L [:]将修改相同的列表。

如果True使用nan,则检查项目是否包含第0个索引处的1,否则使用该项目。

nan = float('nan')
L[:] = [nan if item[0] == 1 else item for item in L]

也许你正试图做这样的事情:

这会检查项目是否在任何位置包含1而不仅仅是0,如果是,则使用nan否则使用该项目。

L[:] = [nan if 1 in item else item for item in L]

答案 2 :(得分:1)

如果您知道要检查的元素......

index_to_check = 3
if my_list[index_to_check] == bad_value:
    del my_list[index_to_check]

答案 3 :(得分:1)

如果您特别想删除它,我建议使用过滤器:

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函数,你甚至可以用lambda函数包装整个函数

custom_filter = lambda x: [float('nan') if item[0]==1 else item for item in x]
L = custom_filter(L)

这些解决方案按性能粗略排列,但它实际上取决于您的特定应用以及您的问题究竟是什么。如果你想在许多不同的列表上使用它,即使custom_filter对象具有进行函数调用的额外开销,可读性也会增加,如果你连续多次使用它,性能差异因为lambda函数会被缓存,所以会消失。

过滤器会快速尖叫,但实际上并不像其他过滤器那样灵活,第二种方法非常接近你原来的意思,但第三种方法可能是最模块化的,老实说我可能会使用的解决方案因为它导致了可读和通用的代码。