2014-09-03 82 views
-1

我使用的是Python的版本2.6的列表功能。Python列表中删除另一个列表与未知变量

我想知道是否有更快的方法来获得想要的结果,而不是遍历所有项目。 我遇到的问题是内部列表,它包含一个动态(未知)变量。我想删除与手动输入列表匹配的那个。

lst = [[5, 222, 5],[6, 0, 2]] 

if [6, 0, _] in lst: 
    lst.remove([6, 0, _]); 

上面的代码似乎不起作用。我正在寻找更优雅的工作解决方案。

+1

_在该代码中未定义。 _不是可用于指示任何值的占位符。 – 2014-09-03 13:57:37

+0

删除元素的具体标准是什么?为此,您可以使用过滤列表。 – fledgling 2014-09-03 13:58:40

+0

你能更好地解释你在做什么?举个例子?什么是'_'? – Elisha 2014-09-03 13:59:50

回答

2

在一个更通用的方法:

lst = [ 
    [1,2,3], 
    [1,2,4], 
    [1,2,6], 
    [2,5,4], 
    [2,5,5], 
    [3,7,9], 
] 

search = [1, None, 6] 
new = [a for a in lst if 
    any(y is not None and x != y for x, y in zip(a, search)) 
] 

print new 

其中None是一个占位符

+0

上引发一个例外,但是请注意,对于'search = [6,0,None]',您的代码将删除'[6,0]' – Korem 2014-09-03 14:12:21

+0

@Korem:当然,仅限此代码如果所有列表的长度相同,则是合理的。 – georg 2014-09-03 14:15:04

+0

谢谢,这是我正在寻找的答案:) – 2014-09-03 14:46:49

-1

如果您始终知道内部列表的第一项和第二项的值,则可以使用列表解析。

l = [i for i in lis if i[0] != 6 and i[1] != 0] 

l = [i for i in lis if i[:2] != [6, 0]] 

的代码更清洁和更Python的方式。在性能方面我不认为会有太大的区别。

+0

原始问题希望从列表中删除以[6,0]开头的项目不提取它们。可能要将其切换到'!=' – 2014-09-03 14:03:56

+0

您的代码在[6,0,5,3]上都会失败,并且与OP所需的内容相反(过滤和未过滤)。它也会在[3] – Korem 2014-09-03 14:04:25

1
In [1]: lis = [[5, 222, 5],[6, 0, 2]] 

In [2]: [x for x in lis if len(x) != 3 or x[0] != 6 and x[1] != 0] 
Out[2]: [[5, 222, 5]] 

该条件从左到右执行。所以我们首先检查每个组件的长度 - 让长度不同于3的列表通过我们的过滤器。如果长度为3,我们会过滤掉第一个项目是6和第二个项目3的列表,而不是第三个项目。

0

我想你你的清单上有[6, 0, '_']这样你就可以用下面的代码删除:

lis = [[5, 222, 5],[6, 0, 2],[6, 0, '_']] 

print [item for item in lis if any(x not in [6, 0, '_'] for x in item)] 

结果:如果没有

[[5, 222, 5], [6, 0, 2]] 

,你有没有[6,0 ,_]在你的清单中,你应该只是将any abuilt的功能更改为all

lis = [[5, 222, 5],[6, 0, 2],[6, 0, '_']] 

print [item for item in lis if all(x not in [6, 0, '_'] for x in item)] 

结果:

[[5, 222, 5]] 
8

这几乎可以肯定是一个坏主意,但我认为这会很有趣使您的原始代码按照您想要的方式工作。我们只需要让_成为一个等于任何东西和任何东西的值。

class OmniMatcher: 
    def __eq__(self, other): 
     return True 

_ = OmniMatcher() 

lis = [[5, 222, 5],[6, 0, 2]] 
if [6, 0, _] in lis: 
    lis.remove([6, 0, _]); 

print(lis) 

结果:

[[5, 222, 5]] 

的[6,0,2]元件被去除,如需要的话。

+0

这是一个黑客,当然......但一个聪明的! – georg 2014-09-03 14:47:36

+0

大声笑我看,你在那里做了什么,好主意,谢谢:) – 2014-09-03 14:49:22

相关问题