0

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

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

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

4

4 回答 4

2

您使用列表推导:

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

if .. else ..部分称为条件表达式

这会将列表替换为新列表。如果您对同一个列表有多个引用,则可以用切片赋值替换列表的元素:

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

现在所有元素L都将替换为列表推导生成的所有元素。这两种表达方式之间的区别是微妙但至关重要的;第一个重新绑定L以指向一个新列表,第二个保留该列表但仅替换列表本身中包含的元素。

于 2013-06-25T14:50:08.120 回答
2

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

这将检查该项目是否在第 0 个索引处包含 1,如果True使用nanelse 则按原样使用该项目。

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

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

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

L[:] = [nan if 1 in item else item for item in L]
于 2013-06-25T14:50:57.687 回答
1

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

index_to_check = 3
if my_list[index_to_check] == bad_value:
    del my_list[index_to_check]
于 2013-06-25T14:50:31.797 回答
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 函数将被缓存。

过滤器会快速尖叫,但实际上不如其他方法灵活,第二种方法非常接近您的原始含义,但第三个示例可能是最模块化的,老实说,我可能会使用它的解决方案,因为它导致可读和通用的代码。

于 2013-06-25T14:51:06.467 回答