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.
4 Réponses :
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)]
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)
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)))
[('R', 'S', 'T'), ('R', 'S', 'T', 'L'), ('R', 'S', 'T', 'L', 'N', 'E')]
Pourriez-vous fournir vos tentatives?