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
将是最快的(因为短路)@paultcount
有一个高效的C实现,并且len
存储在内部,使得此方法相当快。使用timeit
试验,这种方法始终更快。有关更多详细信息,请参阅。
func = lambda x: x.count("?") != len(x)
new_g = list(filter(func, g))