Python trouve l'objet dans une liste
J'ai une liste de personnes:
[
{'name' : 'John', 'wins' : 10 },
{'name' : 'Sally', 'wins' : 0 },
{'name' : 'Fred', 'wins' : 3 },
{'name' : 'Mary', 'wins' : 6 }
]
Je suis ajoutant des victoires à l'aide d'une liste de noms (['Fred', 'Mary', 'Sally']
). Je ne sais pas si le nom est dans la liste des personnes déjà, et j'ai besoin d'insérer un nouvel enregistrement si pas. Actuellement, je suis en train de faire les suivants:
name = 'John'
person = None
pidx = None
for p in people_list:
if p['name'] == name:
person = p
pidx = people_list.index(p)
break
if person is None:
person = {'name' : name, 'wins' : 0}
person['wins'] += 1
if pidx is None:
people_list.append(person)
else
people_list[pidx] = person
Est-il une meilleure façon de le faire avec une liste? Étant donné que je suis sauver ce pour MongoDB je ne peux pas utiliser un dict
qu'il vous fera économiser comme un objet, et je veux utiliser native des fonctions de tableau de tri et de cartographie qui ne sont pas disponibles pour les objets.
source d'informationauteur Josh K | 2011-02-25
Vous devez vous connecter pour publier un commentaire.
Je suis en supposant que vous ne voulez pas utiliser de structure autre que la liste. Votre code devrait fonctionner, même si vous inutilement écrire le dictionnaire retour à la liste après la mise à jour. Les dictionnaires sont copiés par référence, donc une fois que vous mettre à jour, il reste à jour dans la liste. Après un peu de ménage, votre code pourrait ressembler à ceci:
Oui, utiliser un dict.
edit:
Si vous ne voulez pas un dict définitivement utiliser temporairement.
Votre modèle d'accès impose l'utilisation d'une autre structure de données (ou au moins un autre helper structure de données). La numérisation de la liste que vous êtes en train de faire est en fait la bonne chose à faire si vous êtes en utilisant une liste, mais vous ne devriez pas être à l'aide d'une liste (si vous voulez qu'il soit efficace, de toute façon).
Si l'ordre de la liste n'a pas d'importance, vous devez utiliser un Dictionnaire (python
dict
). Si c'est le cas, vous devez utiliser unOrderedDict
de lacollections
module.Vous pouvez également utiliser deux structures de données - la liste que vous avez déjà, et en outre une
set
contenant juste les noms dans la liste de sorte que vous avez un accès rapide à tester l'inclusion ou non. Cependant, laset
ne vous aide pas à accéder au nom réel de données rapidement (si vous souhaitez toujours avoir à faire une recherche linéaire dans la liste pour que), de sorte qu'il serait utile de modèle si vous ne étaient des tests d'inclusion, mais sinon, toujours marcher sur la liste telle qu'elle a été insérée.Modifier: il semble que ce que vous voulez vraiment est une liste et un dict, où le dictionnaire est une mise en correspondance entre les
name
et l'index dans la liste. Sinon, vous pouvez toujours utiliser undict
ouOrderedDict
mais de les insérer dans Mongo comme un tableau en utilisantdict.iteritems()
pour créer un tableau (ou ce qui pourrait ressembler à un tableau de Mongo) sur l'insertion. Vous pouvez utiliser divers mutateurs dezip
de choses dansitertools
à construire, de façon dynamique les objets dont vous avez besoin dans votre matrice résultante.Ce cas spécifique est mis en œuvre par le
collections.Counter
type. Avec la matrice de générateurs, c'est une expression:Si vous voulez un ordre spécifique,
sorted()
est le moyen le plus facile (cela utilise aussi un simple générateur de()
plutôt qu'un tableau générateur[]
puisque c'est temporaire):Où
item['name']
pourrait êtreitem['wins']
ou de toute autre expression comparables.