Python 从列表列表中删除整个列表

Python 从列表列表中删除整个列表,python,list,data-structures,Python,List,Data Structures,我的清单如下: g = [ ["a","?","?","?","?","?","?"], ["?","b","?","?","?","?","?"], ["?","?","?","?","?","?","?"] ] 我想遍历此列表并删除包含所有“?”的列表,这是此列表中的最后一个列表。我尝试了pop()、del和其他一些操作,但到目前为止似乎没有任何效果 以下是我为这一部分所写的内容: for x in g: if x.count("?") == 6:

我的清单如下:

g = [
    ["a","?","?","?","?","?","?"],
    ["?","b","?","?","?","?","?"],
    ["?","?","?","?","?","?","?"]
]
我想遍历此列表并删除包含所有“?”的列表,这是此列表中的最后一个列表。我尝试了pop()、del和其他一些操作,但到目前为止似乎没有任何效果

以下是我为这一部分所写的内容:

for x in g:
    if x.count("?") == 6:
        g.pop(g.index(x))

它不会删除列表,但会从最后一个列表中删除一个“?”。有人能在这里指导我吗。

你应该在这里利用
set

In [152]: X = [["a","?","?","?","?","?","?"],["?","b","?","?","?","?","?"],["?","?","?","?","?","?","?"]]

In [153]: [l for l in X if set(l) != {"?"}]
Out[153]: [['a', '?', '?', '?', '?', '?', '?'], ['?', 'b', '?', '?', '?', '?', '?']]

set(l)
获取列表的唯一值,并从中创建一个
集,将结果集与
{?“}
进行比较就足够了,因为您想删除包含所有
的列表。

尝试以下列表理解:

X = [["a","?","?","?","?","?","?"],["?","b","?","?","?","?","?"],["?","?","?","?","?","?","?"]]

print([l for l in X if l.count("?") == len(l)])
输出:

[['a', '?', '?', '?', '?', '?', '?'], ['?', 'b', '?', '?', '?', '?', '?']]

作为额外的奖励,它比@heemayl的答案快2倍。

也许这会有所帮助

[x for i,x in enumerate(X) if ''.join(x).replace('?','')]
输出:
如果案例列表的理解与您收到的答案不太清楚,可以使用此表格替代

l = [['a', '?'], ['?', '?']]

result = []
for i in l:
    if ('?' in i) and (set(i) == {'?'}):
        continue
    result.append(i)

让我们使用列表理解来解决这个问题-

all([True, True, True)] 
   True
all(True, True, False)
   False
因此,我们将子列表的每个元素与
'?'
进行比较,如果它们是
'?'
,则返回
True
,最后将
all()
函数应用于子列表

g_out = [i for i in g if all([j=='?' for j in i]) == False]
print(g_out)
    [['a', '?', '?', '?', '?', '?', '?'], ['?', 'b', '?', '?', '?', '?', '?']]

您还可以将
filter
lambda
函数一起使用:

func = lambda x: x.count("?") != len(x)
new_g = list(filter(func, g))

我认为<代码> x.POP(g索引(x))<代码>应该是代码> G.POP(g索引(x))<代码> <代码> g>代码>是您的列表列表,<代码> x>代码>是字符列表中的一个。也考虑6比7。对不起,我的坏,这实际上是G.POP(g索引(x)),类型错误。现在更正,希望您能对此作出回应。只需使用列表comp创建一个新列表:
[l代表x中的l,如果有的话(el!=“?”代表l中的el)]
在迭代过程中,
弹出
的问题是,您将跳过列表中的下一项;这是怎么回事?例如,考虑当前迭代位于索引0,并且<代码>如果条件原来是<代码>真< /代码>,这意味着您<代码> POP该索引0中的项,迭代将在何处???为什么这要快2倍
count()
set()
应该具有相同的复杂性。对于速度,
any
all
将是最快的(因为短路)@pault
count
有一个高效的C实现,并且
len
存储在内部,使得此方法相当快。使用
timeit
试验,这种方法始终更快。有关更多详细信息,请参阅。
func = lambda x: x.count("?") != len(x)
new_g = list(filter(func, g))