Python列表删除另一个具有未知变量的列表
我正在使用python的2.6版及其列表功能 我想知道是否有更快的方法来获得想要的结果,而不是迭代它的所有项。 我遇到的问题是内部列表,它包含一个动态未知变量。我想删除与手动输入列表匹配的列表Python列表删除另一个具有未知变量的列表,python,list,python-2.6,Python,List,Python 2.6,我正在使用python的2.6版及其列表功能 我想知道是否有更快的方法来获得想要的结果,而不是迭代它的所有项。 我遇到的问题是内部列表,它包含一个动态未知变量。我想删除与手动输入列表匹配的列表 lst = [[5, 222, 5],[6, 0, 2]] if [6, 0, _] in lst: lst.remove([6, 0, _]); 上面的代码似乎不起作用。我正在寻找更优雅、更有效的解决方案。如果您总是知道内部列表第一项和第二项的值,您可以使用列表理解 l = [i for i
lst = [[5, 222, 5],[6, 0, 2]]
if [6, 0, _] in lst:
lst.remove([6, 0, _]);
上面的代码似乎不起作用。我正在寻找更优雅、更有效的解决方案。如果您总是知道内部列表第一项和第二项的值,您可以使用列表理解
l = [i for i in lis if i[0] != 6 and i[1] != 0]
或
这样的代码更干净、更具python风格。就性能而言,我认为不会有太大区别
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,我们将筛选出第一项为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]]
[[5, 222, 5]]
如果没有,并且列表中没有[6,0,u0],则只需将函数中的any abilt更改为all:
结果:
[[5, 222, 5], [6, 0, 2]]
[[5, 222, 5]]
以更一般的方式:
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
如果没有占位符,这几乎肯定是个坏主意,但我认为让您的原始代码按照您想要的方式工作会很有趣。我们只需要使uu成为一个与任何事物相比都相等的值
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]元素。\uu在该代码中未定义。\u不是可用于指示任何值的占位符。是否有删除元素的特定条件?为此,你们可以使用过滤列表。你们能更好地解释你们想做什么吗??举个例子?什么是?u?因为我将忽略这个名称是一个约定,而不是实际的语法。您不能将其用作那样的通配符。第三个变量是我不关心的变量,可以是-50或555,没关系。原始问题希望从列表中删除以[6,0]开头的项,而不是提取它们。可能想把它换成一个=您的代码在[6,0,5,3]上都会失败,并且执行的操作与OP希望的过滤是相反的。这也会在[3]上引发一个异常,做得很好,但请注意,对于search=[6,0,None],您的代码将删除[6,0]@Korem:当然,只有当所有列表的长度相同时,此代码才有意义。谢谢,这是我一直在寻找的答案: