python newb ici à la recherche d'une assistance ...
Pour un nombre variable de dict dans une liste Python comme: p> J'essaie de trouver le meilleure façon de grouper les dictes où la valeur de la clé "ID" est égale, puis ajoutez / fusionner une clé unique: valeur et créez une nouvelle liste de dicts comme: p> mais je me débats avec comment construire la nouvelle liste de dicts à: p> 1) ajoutez les clés et les valeurs supplémentaires à la première instance de dict qui a le même "ID" P> 2) définissez le nouveau nom pour "Item" et "Prix" (par exemple " Item1 "," item2 "," item3 "). Cela me semble maladroit, y a-t-il une meilleure façon? P> 3) en boucle sur chaque correspondance de chaque "ID" pour créer une chaîne pour une sortie ultérieure P> J'ai choisi de renvoyer un Nouvelle liste de dicts uniquement en raison de la commodité de passer une dict à une fonction de modèles où le réglage des variables par une clé descriptive est utile (il existe de nombreux Vars). S'il y a un moyen plus propre plus concis de l'accomplir, je serais curieux d'apprendre. Encore une fois, je suis assez nouveau à Python et en travaillant avec des structures de données comme celle-ci. P> p>
3 Réponses :
J'imagine qu'il serait plus facile de combiner les éléments de liste_dicts dans quelque chose qui ressemble plus à ceci: p>
Vous pouvez également utiliser une liste de tuples pour «articles» ou peut-être un tuple nommé. P> list_dicts2 = [{'id': 1, 'Nom': 'Jim', 'Articles': [{itemName ':' Crayon ',' Prix ':' 0.99 '}], {' ID ': 2,' Nom ':' Mary ',' Articles ': [{' Nom ':' Book ',' Prix ':' 15.49 '}, {' ItemName ':' Tape ',' Prix ':' 7,99 '}]] code> p>
Cela ressemble beaucoup à un problème de devoirs.
Comme l'affiche ci-dessus mentionné, il existe quelques structures de données plus appropriées pour ce type de données, une variante sur ce qui suit pourrait être raisonnable: p>
list3 = [] for id,name,itemList in list2: newitem = dict({'id':id,'name':name}) for index,items in enumerate(itemList): newitem['item'+str(index+1)] = items[0] newitem['price'+str(index+1)] = items[1] list3.append(newitem)
Essayez d'éviter les structures de données imbriquées complexes. Je crois que les gens ont tendance à Ne les grok que pendant qu'ils utilisent de manière intensive la structure de données. Après le Le programme est terminé ou est mis de côté pendant un certain temps, la structure de données rapidement devient mystification.
Les objets peuvent être utilisés pour conserver ou même ajouter de la richesse à la structure de données de Saner, de manière plus organisée. Par exemple, il apparaît le De même, une personne semble avoir un Si vous achetez dans l'idée d'utiliser des classes comme celles-ci, votre puis, pour fusionner les personnes basées sur code> id code>, vous pouvez utiliser la fonction Mettre tout ensemble: p > élément code> et
code> allez toujours ensemble. De sorte que les deux pièces de données peuvent aussi bien être jumelées dans un objet: p>
ID code> et
et
Nom code> et un ensemble de possessions: p>
list_dicts code> pourrait devenir p>
de Python's code>,
Avec
Take_items code>, qui prend (fusionne) les éléments d'une personne et les donne à un autre: p>
import itertools
import operator
class Item(object):
def __init__(self,name,price):
self.name=name
self.price=price
def __str__(self):
return '{0} {1}'.format(self.name,self.price)
class Person(object):
def __init__(self,id,name,*items):
self.id=id
self.name=name
self.items=set(items)
def __str__(self):
return '{0} {1}: {2}'.format(self.id,self.name,map(str,self.items))
list_people = [
Person('001','jim',Item('pencil',0.99)),
Person('002','mary',Item('book',15.49)),
Person('002','mary',Item('tape',7.99)),
Person('003','john',Item('pen',3.49)),
Person('003','john',Item('stapler',9.49)),
Person('003','john',Item('scissors',12.99)),
]
def take_items(person,other):
'''
person takes other's items.
Note however, that although person may be altered, other remains the same --
other does not lose its items.
'''
person.items.update(other.items)
return person
list_people2 = [reduce(take_items,g)
for k,g in itertools.groupby(list_people, lambda person: person.id)]
for person in list_people2:
print(person)