0
votes

Tableau de filtre de dictionnaires basés sur la valeur

Je suis certain que cela a été répondu, mais je ne trouve pas d'exemple et j'ai du mal à le comprendre.

J'ai un tableau de dict. Chaque dict a une liste d'équipes. Je veux filtrer le tableau où l'ID de l'équipe n'est pas dans la liste. Par exemple: p> xxx pré>

Je veux filtrer la matrice pour obtenir uniquement les équipes où ID est "B": p>

items = filter(items, lambda x: 'b' in x['teams'])


1 commentaires

Un moyen simple de rendre ce problème plus facile à résoudre vous-même serait d'écrire le lambda comme fonction réelle. (A également un effet secondaire d'être auto-documentant.)


3 Réponses :


1
votes

Vous pouvez utiliser tout () code> avec la liste intérieure pour rechercher des équipes où n'importe quelle équipe intérieure code> a l'identifiant souhaité:

items = [{'teams':[{'id':'a'}]}, {'teams':[{'id':'b'}]}, {'teams':[{'id':'a'},{'id':'b'}]}]

search = 'b'
list(filter(lambda item: 
        any(team['id'] == search 
        for team in item['teams']), items)
)
# [{'teams': [{'id': 'b'}]}, {'teams': [{'id': 'a'}, {'id': 'b'}]}]


4 commentaires

Votre utilisation de WhitSpace rend cela vraiment difficile à lire. En outre, vous utiliseriez simplement une expression de générateur si vous "Besoin de l'évaluation paresseuse du filtre".


Une expression génératrice ne serait pas différente, c'est le point.


Rappelle à mon vieille blague: 'Q: Combien de développeurs faut-il pour changer une ampoule? A: 10: Un pour changer l'ampoule et neuf autres lui disent comment ils l'auraient mieux fait ». Si votre générateur est la réponse, vous devriez Soumettre une réponse . Downvoting Solutions de travail qui répondent à la question est de très mauvais goût.


Nice, je n'ai pas rencontré cette version de la blague.



3
votes

Vous êtes à mi-chemin là-bas. Vous pouvez utiliser n'importe quel code> et une expression génératrice pour vérifier si 'B' est dans les équipes.

output = [
   team
   for team in items
   if any(t['id'] == 'b' for t in team['teams'])
]
# [{'teams': [{'id': 'b'}]}, {'teams': [{'id': 'a'}, {'id': 'b'}]}]


0 commentaires

1
votes

Voici une fonction de vérifier s'il y a une équipe particulière dans une liste des équipes:

items_with_team_b = [x for x in items if contains_team(x["teams"], "b")]


0 commentaires