我有一个列表列表,如下所示:
g = [
["a","?","?","?","?","?","?"],
["?","b","?","?","?","?","?"],
["?","?","?","?","?","?","?"]
]
我要遍历此列表并删除包含所有“?”的列表,这是此列表列表中的最后一个列表。我已经尝试过pop(),del和其他一些操作,但到目前为止似乎没有任何作用。
这是我为这部分写的内容:
for x in g:
if x.count("?") == 6:
g.pop(g.index(x))
它不会删除列表,而是删除一个“?”从最后一个列表。任何人都可以在这里指导我。
答案 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)
您也可以将filter
与lambda
函数一起使用:
func = lambda x: x.count("?") != len(x)
new_g = list(filter(func, g))