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

时间:2019-01-11 03:38:53

标签: python list data-structures

我有一个列表列表,如下所示:

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

我要遍历此列表并删除包含所有“?”的列表,这是此列表列表中的最后一个列表。我已经尝试过pop(),del和其他一些操作,但到目前为止似乎没有任何作用。

这是我为这部分写的内容:

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

它不会删除列表,而是删除一个“?”从最后一个列表。任何人都可以在这里指导我。

6 个答案:

答案 0 :(得分:4)

您应该在这里利用set

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

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

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

答案 1 :(得分:2)

尝试此列表理解:

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

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

输出:

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

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

答案 2 :(得分:1)

也许这会有所帮助!

[x for i,x in enumerate(X) if ''.join(x).replace('?','')]

输出:

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

答案 3 :(得分:1)

如果您对列表的理解不是很清楚,可以使用这种形式;

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

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

答案 4 :(得分:0)

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

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', '?', '?', '?', '?', '?']]

答案 5 :(得分:0)

您也可以将filterlambda函数一起使用:

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