Disons que j'ai une liste de dictionnaires.
listOfNames = ["Joel", "Rachel"]
Je veux obtenir une liste de noms dont l'âge est de 10 ans. La sortie ressemblerait donc à ceci.
listOfDict = [{"name": "Joel","Age": "10","Grade": "A"},{"name": "Adam","Age": "11","Grade": "B"},{"name": "Rachel","Age": "10","Grade": "B"}]
Y a-t-il un moyen de faire cela sans utiliser de boucles for ou if. J'ai essayé d'utiliser la fonction Lambda mais en vain.
4 Réponses :
Y a-t-il un moyen de faire cela sans utiliser de boucles for ou de conditions if
Non, il n'y en a pas!
Utilisez une boucle. C'est inévitable à certains niveaux. En utilisant une compréhension de liste:
res = [d['name'] for d in listOfDict if d['Age'] == '10']
Cela fonctionne.
Utilisation de lambda:
result = list(map(lambda x: x['name'] if x['Age'] == "10" else None, listOfDict )) result = [x for x in result if x is not None] print(result)
Pas de pour boucles ou if conditions utilisant pandas.DataFrame :
['Joel', 'Rachel']
OUTPUT
import pandas as pd df=pd.DataFrame.from_dict(listOfDict) result=df[df['Age']=='10']['name'].tolist()
L'indexation chaînée est explicitement déconseillée dans la documentation, utilisez plutôt df.loc [df ['Age'] == '10', 'name']]. Tolist () .
Il existe un moyen d'utiliser les fonctions lambda, avec map et filter pour obtenir le résultat souhaité sans utiliser ni pour boucle ou si condition, mais le code sera un peu difficile à lire:
['Joel', 'Rachel']
Résultat:
listOfDict = [{"name": "Joel","Age": "10","Grade": "A"},{"name": "Adam","Age": "11","Grade": "B"},{"name": "Rachel","Age": "10","Grade": "B"}]
listOfNames = list(map(lambda elem: elem['name'], list(filter(lambda elem: elem['Age']=="10",listOfDict))))
print(listOfNames)
Non seulement difficile à lire, mais aussi moins efficace. Il faut noter que se débarrasser des instructions for / si ne conduit pas nécessairement à un code optimisé.
@jpp Je suis totalement d'accord avec vous, mais la question de l'OP était de trouver un moyen d'obtenir le résultat souhaité sans utiliser les conditions for ou if .