如果元组的元素不在字符串列表中,则从元组列表中删除元组

ros*_*er9 0 python list-comprehension

我正在处理一些代码,如果元组在单独的列表中未包含所有字符串,则需要从元组列表中删除元组。我已经在for循环中使用了它,但是我正在尝试提高代码的效率。例如,如果我有

list_of_tups = [('R', 'S', 'T'), ('A', 'B'), ('L', 'N', 'E'), ('R', 'S', 'T', 'L'), ('R', 'S', 'T', 'L', 'N', 'E')]
needed_strings = ['R', 'S', 'T']
Run Code Online (Sandbox Code Playgroud)

我想将以下元组保留在列表中:

[('R', 'S', 'T'), ('R', 'S', 'T', 'L'), ('R', 'S', 'T', 'L', 'N', 'E')]
Run Code Online (Sandbox Code Playgroud)

这适用于以下for循环:

for s in needed_strings:
    for tup in list_of_tups:
        if s not in tup:
            list_of_tups.remove(tup)
Run Code Online (Sandbox Code Playgroud)

但是,我希望通过列表理解来完成。我尝试这样做的结果是产生一个元组列表,其中任何字符串(不是全部)都出现在元组中。

Mar*_*yer 5

您可以使用all嵌套的理解:

list_of_tups = [('R', 'S', 'T'), ('A', 'B'), ('L', 'N', 'E'), ('R', 'S', 'T', 'L'), ('R', 'S', 'T', 'L', 'N', 'E')]
needed_strings = ['R', 'S', 'T']

[t for t in list_of_tups if all(c in t for c in needed_strings)]
Run Code Online (Sandbox Code Playgroud)

结果

[('R', 'S', 'T'), ('R', 'S', 'T', 'L'), ('R', 'S', 'T', 'L', 'N', 'E')]
Run Code Online (Sandbox Code Playgroud)

只要列表包含可哈希项,那么可能更容易阅读的替代方法是制作needed_strings一个set。那你可以用issubset()

list_of_tups = [('R', 'S', 'T'), ('A', 'B'), ('L', 'N', 'E'), ('R', 'S', 'T', 'L'), ('R', 'S', 'T', 'L', 'N', 'E')]
needed_strings = set(['R', 'S', 'T'])

[t for t in list_of_tups if needed_strings.issubset(t)]
Run Code Online (Sandbox Code Playgroud)