Considérez le code suivant:
some_list = [
{'id' : '3459', 'name' : 'Alice'},
{'id' : '1112', 'name': 'Bob'}
]
person_id = '3459'
# Search person id in list of dictionaries and return {'id' : '3459', 'name' : 'Alice'}
Connaissant le person_id , est-il possible de rechercher cette some_list par 'id ' pour saisir tout le dictionnaire? Actuellement, je fais cela avec une boucle for, mais j'étais curieux de savoir s'il y avait d'autres implémentations. Merci à tous ceux qui ont répondu.
4 Réponses :
Vous pouvez essayer ce qui suit:
[entry for entry in some_list if person_id in entry['id']][0]
Si vous voulez que le résultat ne soit pas une liste, essayez ceci:
[entry for entry in some_list if person_id in entry['id']]
Vous pouvez transformer la structure en un dictionnaire imbriqué, où la clé est id . Ensuite, vous maintenez des recherches O (1) constantes, au lieu de parcourir la liste en temps O (N) linéaire.
Exemple:
data = {
'3459': 'Alice',
'1112': 'Bob'
}
person_id = '3459'
print(data[person_id])
# Alice
Vous pouvez également avoir simplement nom comme valeur au lieu d'un dictionnaire:
data = {
'3459': {
'name' : 'Alice'
},
'1112': {
'name': 'Bob'
}
}
person_id = '3459'
print(data[person_id])
# {'name': 'Alice'}
Remarque: Cela suppose qu'il n'y a pas d'ID en double, comme @ Chris_Rands mentionné dans les commentaires
id name 1 1112 Bob 0.0030059814453125
Comment le temps d'exécution de cette implémentation se compare-t-il à la solution proposée par RoadRunner?
@KyleDeGennaro J'ai mis à jour la réponse. Pandas a C ++ sous le capot et c'est un moyen très rapide. Crois moi :)
ce sera toujours une itération, puisque vous parcourez une liste, donc plus la structure est longue, plus votre code prend du temps. La solution de RoadRunner est une solution de contournement pour éviter d'utiliser des listes et a donc la même vitesse quelle que soit la taille des données.
@RedaDrissi ouais c'est plus lent que O (1) quand on trouve par clé dans dict. Mais plus rapide que de trouver dans la liste
La solution RoadRunners n'utilise pas de listes. Votre solution aura au mieux la complexité du pire des cas O (n), car vous devez itérer manuellement à travers chaque élément, vous avez mentionné que pandas utilise du code C ++, c'est peut-être pourquoi c'est plus rapide que d'itérer la liste en python.
Cela fonctionne bien:
some_list = [
{'id' : '3459', 'name' : 'Alice'},
{'id' : '1112', 'name': 'Bob'}
]
person_id = '3459'
result = list(filter(lambda x : x['id'] == person_id,
some_list))
print(result)
non, puisqu'il s'agit d'une liste, vous avez perdu la capacité des recherches rapides qu'offre un dict. une certaine forme d'itération est maintenant nécessaire, à moins que vous n'utilisiez un dict au lieu d'une liste.
oui, vous feriez mieux de refactoriser
some_listen quelque chose comme un dict avec l'ID de clé et le nom de la valeur@Chris_Rands avez-vous une implémentation rapide de cela?
En supposant qu'il n'y a pas d'ID en double:
{d ['id']: d ['name'] for d dans some_list}@Chris_Rands À quoi fait référence
d?est-ce que tu l'as essayé? chaque dictionnaire dans
some_listcommepour d dans some_list: