0
votes

Python - Comment utiliser la fonction map et la fonction lambda avec la condition if

Je veux comparer la liste de mots et la liste de contrôle en utilisant la fonction de carte et la fonction lambda si les mots de la liste de mots et de la liste de contrôle. ces mots seront supprimés dans la liste de mots. Est-ce que quelqu'un peut m'aider? Merci beaucoup

wordlist = ['hello','world','Tom']
checklist = ['hello','world']

print('before')
print(wordlist)

list(map(lambda x: wordlist.remove(x) if x in checklist else None ,wordlist))
print('after')
print(wordlist)

Résultat actuel: avant ['bonjour', 'monde', 'Tom'] après ['monde', 'Tom']

Résultat attendu: avant ['bonjour', 'monde', 'Tom'] après ['Tom']


2 commentaires

Il ne faut jamais supprimer des éléments d'une liste tout en l'itérant.


@bereal a raison. Il est préférable d'ajouter toutes les chaînes qui ne correspondent pas à une nouvelle liste: new_lsit = [x for x in wordlist if x not in checklist]


3 Réponses :


1
votes

map produit toujours un élément de sortie pour chaque élément d'entrée, il ne peut pas supprimer d' éléments. De plus, la map ne doit pas être utilisée pour muter des objets , ce n'est pas son travail, et comme elle est paresseuse, les résultats peuvent être inattendus.

filter est conçu pour créer une sortie avec moins d'éléments que l'entrée, bien qu'il soit surtout utile si vous avez déjà une fonction de prédicat (filtrage) prête à l'emploi.

Puisque vous ne le faites pas, vous pouvez et devez utiliser des compréhensions qui fournissent un moyen relativement laconique d'effectuer l'itération, le filtrage, le mappage et la collecte en une seule construction:

wordlist = ['hello','world','Tom']
checklist = ['hello','world']

print('before')
print(wordlist)

wordlist = [word for word in wordlist if word not in checklist]
print('after')
print(wordlist)

ps: si vous voulez modifier les choses sur place, utilisez une boucle régulière


3 commentaires

c'est la limitation de la fonction de carte. Merci beaucoup


«Limitation» n'est pas le bon terme, cela indique une insuffisance. Un ours incapable de voler n'est pas une «limitation», il ne fait tout simplement pas partie de son caractère d'ours. Et de la même manière, la map a un travail très spécifique et le filtrage des éléments ne fait pas partie de ce travail.


tu as raison. J'ai juste hâte de savoir ce que la fonction de carte peut faire et ce qu'elle ne peut pas faire. En fait, supprimer le mot de la liste n'est pas mon objectif. Je veux appliquer une fonction objet sur tous les éléments par itération. Je veux le résoudre en une seule ligne



0
votes

Vous pouvez essayer ceci à la place, qui n'utilise pas lambda mais accomplit votre objectif. Faites-nous savoir si vous devez absolument utiliser lambda . Le problème avec votre expression lambda est que vous modifiez la liste que vous fournissez à mapper dans la fonction lambda.

wordlist_2 [word for word in wordlist if word not in checklist and word]

Le dernier and word est de ne pas ajouter None à votre liste.


1 commentaires

compris maintenant! Merci beaucoup, je m'entraîne à utiliser la fonction de carte et la fonction lambda.



0
votes

Le problème est que vous supprimez des éléments de la liste de wordlist tout en l'itérant, ce qui interfère avec l'itération. Mais la map n'est pas la bonne chose à utiliser pour cela.

La solution la plus proche de ce que vous faites maintenant utilise le filter :

y = [x for x in wordlist if x not in checklist]

Cela renvoie un objet filtre qui est ensuite converti en liste.

Il est probablement préférable d'utiliser simplement une compréhension de liste:

x = list(filter(lambda x: x not in checklist, wordlist))

Ces deux produits produisent le même résultat.

Notez que si la checklist est volumineuse, il serait plus efficace de créer d'abord un ensemble, puis de vérifier l'appartenance à l'ensemble, par exemple checkset = set(checklist) , puis x not in checkset . Fonctionnellement, c'est la même chose, mais l'ensemble est plus efficace si la checklist est volumineuse.


0 commentaires