Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python列表删除另一个具有未知变量的列表_Python_List_Python 2.6 - Fatal编程技术网

Python列表删除另一个具有未知变量的列表

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

我正在使用python的2.6版及其列表功能

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

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:当然,只有当所有列表的长度相同时,此代码才有意义。谢谢,这是我一直在寻找的答案: