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

时间:2019-06-17 16:28:30

标签: 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']

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

[('R', 'S', 'T'), ('R', 'S', 'T', 'L'), ('R', 'S', 'T', 'L', 'N', 'E')]

这在以下for循环中有效:

for s in needed_strings:
    for tup in list_of_tups:
        if s not in tup:
            list_of_tups.remove(tup)

但是,我希望通过列表理解来做到这一点。我尝试这样做的结果是生成一个元组列表,其中任何个字符串而不是 all 出现在元组中。

4 个答案:

答案 0 :(得分: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)]

结果

[('R', 'S', 'T'), ('R', 'S', 'T', 'L'), ('R', 'S', 'T', 'L', 'N', 'E')]

只要列表包含可哈希项,可能更容易阅读的替代方法是将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)]

答案 1 :(得分:1)

您可以尝试一下,

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']
y=[x for x in list_of_tups if set(needed_strings).issubset(set(x))] 
print(y)

输出:

[('R', 'S', 'T'), ('R', 'S', 'T', 'L'), ('R', 'S', 'T', 'L', 'N', 'E')]

答案 2 :(得分:1)

list_of_tups = [
    ('R', 'S', 'T'), 
    ('A', 'B'), 
    ('L', 'N', 'E'), 
    ('R', 'S', 'T', 'L'), 
    ('R', 'S', 'T', 'L', 'N', 'E')
]
needed_chars = {'R', 'S', 'T'}  # using a set to speed up membership operations

# Append the tuple element from the list of tuples if the condition is met
list_of_tups_removed = [
    tup
    for tup in list_of_tups
    if any(c in needed_chars for c in tup)  # if any of the characters are present in needed_chars 
]

print(list_of_tups_removed)

输出:

[('R', 'S', 'T'), ('R', 'S', 'T', 'L'), ('R', 'S', 'T', 'L', 'N', 'E')]

列表理解语法只能用于创建新列表。它不能用于从现有列表中删除元素。

答案 3 :(得分:0)

您还可以使用nums = list(range(2, 11)) def f(num, nums): return list(filter(lambda a: a == num or a % num, nums)) count = 0 for i in range(len(nums)): if i < len(nums): nums = f(nums[i], nums) count+=1 print(nums) print(count) 函数和lambda来检查set.issubset中的每个元素是否在needed_strings列表的给定元素中并最终将其过滤掉:

list_of_tups

输出:

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']
print(list(filter(lambda x: set(tuple(needed_strings)).issubset(x), list_of_tups)))