0
votes

Supprimer le tuple de la liste des tuples si les éléments du tuple ne sont pas dans une liste de chaînes

Je travaille sur un code dans lequel je dois supprimer un tuple d'une liste de tuples si le tuple ne contient pas toutes les chaînes dans une liste séparée. Je l'ai fait fonctionner dans une boucle for, mais j'essaie d'améliorer l'efficacité de mon code. Par exemple, si j'ai

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

, je souhaite conserver les tuples suivants dans ma liste:

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

Cela fonctionne dans ce qui suit pour -loop:

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

Cependant, j'aimerais que cela se fasse via la compréhension de liste. Mes tentatives pour faire cela aboutissent à une liste de tuples où n'importe laquelle des chaînes, et non toutes , apparaît dans le tuple.


1 commentaires

Pourriez-vous fournir vos tentatives?


4 Réponses :


5
votes

Vous pouvez utiliser all avec une compréhension imbriquée:

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)]

résultat

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

Tant que les listes contiennent des éléments hachables, une alternative qui peut être un peu plus facile à lire est de faire de required_strings un ensemble . Ensuite, vous pouvez utiliser issubset()

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)]


0 commentaires

1
votes

Vous pouvez essayer ceci,

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

Sortie:

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)


0 commentaires

0
votes

Vous pouvez également utiliser la fonction lambda et set.issubset pour vérifier si chaque élément de required_strings est dans un élément donné de list_of_tups et enfin filtrer:

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

sortie:

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)))


0 commentaires

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

0 commentaires