2014-10-19 52 views
-5

我想从列表及其子列表中删除指定的值。这里是我的代码:删除列表及其子列表中的值

example = [['x', 'y'], ['x', 'y'], ['x']] 
value = 'x' 
if value in example: 
    example.remove(value) 
    print(example) 

在这种情况下,价值'x'出现在每个子列表列表中的example。所以这是我想返回值:

[['y'], ['y'], []] 

不过,我目前的方法输出我得到的是:

[['x', 'y'], ['x', 'y'], ['x']] 

有谁有我的问题的解决方案,如果没有输出列表指定值?

+1

你想找到其数值发生在所有内部列表中? – thefourtheye 2014-10-19 19:43:48

+0

为什么你想为此使用'len()'函数? – 2014-10-19 19:45:39

+2

你试图自己解决吗? – Vader 2014-10-19 19:47:02

回答

0

如何:

>>> l = [['x', 'y', 'z'], ['x', 'z', 'y'], ['x', 'z']] 
>>> [item for item in l[0] if all(item in sublist for sublist in l[1:])] 
['x', 'z'] 

如果一个产品在所有子列表,它必须在第一子列表(l[0])。因此,我们建立我们新的列表使用list comprehension

[item for item in l[0]] 

但我们只需要使用一个项目,如果该项目是在所有其他子列表(介于l[1:]开始),这意味着我们需要检查

if all(item in sublist for sublist in l[1:]) 

将两者结合起来,您就有了解决方案。

+1

如果列表如下所示:'l = [['x','y','z','z'],['x','z','y'],['x','z “]]'? – Vader 2014-10-19 19:55:25

+0

好点,如果有必要,我们总是可以使用set(l [0])。 – 2014-10-19 19:58:25

0

不是最有效的方式,但你可以采取的union让所有的唯一密钥,那么intersection一遍原来的列表,如:

inall = set().union(*your_list).intersection(*your_list) 
0
l = [['x', 'y'], ['x', 'y'], ['x']] 

print(set.intersection(*map(set,l))) 
set(['x'])