我使用的是Python的版本2.6的列表功能。Python列表中删除另一个列表与未知变量
我想知道是否有更快的方法来获得想要的结果,而不是遍历所有项目。 我遇到的问题是内部列表,它包含一个动态(未知)变量。我想删除与手动输入列表匹配的那个。
lst = [[5, 222, 5],[6, 0, 2]]
if [6, 0, _] in lst:
lst.remove([6, 0, _]);
上面的代码似乎不起作用。我正在寻找更优雅的工作解决方案。
我使用的是Python的版本2.6的列表功能。Python列表中删除另一个列表与未知变量
我想知道是否有更快的方法来获得想要的结果,而不是遍历所有项目。 我遇到的问题是内部列表,它包含一个动态(未知)变量。我想删除与手动输入列表匹配的那个。
lst = [[5, 222, 5],[6, 0, 2]]
if [6, 0, _] in lst:
lst.remove([6, 0, _]);
上面的代码似乎不起作用。我正在寻找更优雅的工作解决方案。
在一个更通用的方法:
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
是一个占位符
如果您始终知道内部列表的第一项和第二项的值,则可以使用列表解析。
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的方式。在性能方面我不认为会有太大的区别。
原始问题希望从列表中删除以[6,0]开头的项目不提取它们。可能要将其切换到'!=' – 2014-09-03 14:03:56
您的代码在[6,0,5,3]上都会失败,并且与OP所需的内容相反(过滤和未过滤)。它也会在[3] – Korem 2014-09-03 14:04:25
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的列表,而不是第三个项目。
我想你你的清单上有[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]]
这几乎可以肯定是一个坏主意,但我认为这会很有趣使您的原始代码按照您想要的方式工作。我们只需要让_
成为一个等于任何东西和任何东西的值。
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]元件被去除,如需要的话。
这是一个黑客,当然......但一个聪明的! – georg 2014-09-03 14:47:36
大声笑我看,你在那里做了什么,好主意,谢谢:) – 2014-09-03 14:49:22
_在该代码中未定义。 _不是可用于指示任何值的占位符。 – 2014-09-03 13:57:37
删除元素的具体标准是什么?为此,您可以使用过滤列表。 – fledgling 2014-09-03 13:58:40
你能更好地解释你在做什么?举个例子?什么是'_'? – Elisha 2014-09-03 13:59:50