正在删除列表中与“无”对应的元素

2024-10-01 07:41:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两张单子

x = [ None , None , "foo" , "bar" ]
y = [ "bar" , "foo" , "foo" ,"bar"]

len(x) == len(y)

我想检查列表x中是否存在一个元素,即None,然后删除该元素并删除y中相应的元素。 像removex[0] == None,所以从xy中移除x[0]y[0]

结果应该是:

x = ["foo","bar"]
y = ["foo","bar"]

我尝试了一种非常非python的方法,它给了我一个“列表索引超出范围”的错误:

for i in range(0,len(x)):
    if(x[i] == None):
        x.remove(x[i])
        y.remove(y[i])

Tags: 方法innone元素列表forlenfoo
3条回答

使用zip方法可以很好地实现这一点:

x, y = zip(*[(e_x, e_y) for e_x, e_y in zip(x, y) if e_x is not None])

在这里,您可以一次遍历两个列表,创建一个包含x和y元素的元组的新列表。只有当x e_x中的元素不是None时,才会添加这些元组。 外部的zip将元组列表转换回两个单独的列表中。你知道吗

编辑:正如金刚在评论中指出的那样,最好使用is not None而不是!= None。我相应地更新了代码。你知道吗

我们把你的名单称为xs和ys。你知道吗

ys = [y for (x, y) in zip(xs, ys) if x]
xs = [x for x in xs if x]

应该会成功的。你知道吗

首先检查并找出需要删除的内容:

remove_ix = {ix for ix, val in enumerate(x) if val is None}

现在可以用它来过滤xy

x = [item for ix, item in enumerate(x) if ix not in remove_ix]
y = [item for ix, item in enumerate(y) if ix not in remove_ix]

请注意,在您的版本中,您将跳过索引并可能拥有IndexError,因为如果列表的初始长度是N,并且您删除了一个项目,那么您仍然会循环N次,但是列表现在是N-1个项目。同样使用list.remove,如果存在重复项(在您的示例中有重复项),则不能保证您正在删除正确的

相关问题 更多 >