我希望从列表中删除多个索引,并希望按内容过滤它们。例如:
L= [(1, 2, 3), (etc, etc, etc), (......)]
if L[i] == 1:
L[i] == nan
>>>L
[(nan), (etc, etc.......]
我知道这段代码不正确,但这只是一个帮助迭代我想做的事情的例子,感谢任何帮助。谢谢。
答案 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函数会被缓存,所以会消失。
过滤器会快速尖叫,但实际上并不像其他过滤器那样灵活,第二种方法非常接近你原来的意思,但第三种方法可能是最模块化的,老实说我可能会使用的解决方案因为它导致了可读和通用的代码。