2
votes

Python supprime le dictionnaire dans une liste par clé

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.


6 commentaires

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_list en 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_list comme pour d dans some_list:


4 Réponses :


1
votes

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']]


0 commentaires

5
votes

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


0 commentaires

0
votes
     id name
1  1112  Bob
0.0030059814453125

5 commentaires

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.



0
votes

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)


0 commentaires