J'ai trois listes Python que je veux faire dans un dictionnaire, puis rejoindre ces trois dictionnaires à une seule fois sur les valeurs de clé.
Mes listes Python sont fabriquées comme ceci: p> et ils ressemblent à ceci: p> list2 strong> p> TypeError: list indices must be integers or slices, not str
3 Réponses :
L'exemple de vos échantillons de données ne semble pas avoir des entrées correspondantes, en supposant que votre ensemble de données complète aura des correspondances pour tout ce que vous pouvez faire quelque chose comme ça.
l1 = [['transaction_id', '224847627', 'product_amount', '2.73', 'user_invoice_date', '2018-12-21'], ['transaction_id', '67919397', 'product_amount', '2.73', 'user_invoice_date', '2017-10-26']] l2 = [['tracking_code', '29285908', 'from_country', 'FR', 'to_country', 'FR', 'package_type_id', '10', 'transaction_id', '172238850', 'shipping_label_created', '2018-09-25 18', '40', '52'], ['tracking_code', '22105784', 'from_country', 'FR', 'to_country', 'FR', 'package_type_id', '10', 'transaction_id', '111423825', 'shipping_label_created', '2018-04-13 11', '22', '44']] l3 = [['tracking_code', '21703238', 'from_country', 'FR', 'to_country', 'FR', 'amount', '3.23'], ['tracking_code', '41545695', 'from_country', 'FR', 'to_country', 'FR', 'amount', '2.9']] # Convert everything to dict result = {y['transaction_id']:y for y in [dict(zip(x[::2], x[1::2])) for x in l1]} d2 = {y['transaction_id']:y for y in [dict(zip(x[::2], x[1::2])) for x in l2]} d3 = {y['tracking_code']:y for y in [dict(zip(x[::2], x[1::2])) for x in l3]} # Update result dict with data from the other lists. for entry in result.values(): entry.update(d2[entry['transaction_id']]) entry.update(d3[entry['tracking_code']])
Merci, ça a fonctionné. Je vois que la valeur transaction_id code> est la clé et la valeur est le reste de la partie de dictionnaire
{... "montant": '2.9'}, '131734284': {'transaction_id' : '131734284', 'product_amount': '2.73', 'user_invoice_date': '2018-06-14', 'tracking_code': '24503936', 'from_country': 'FR', 'TO_Country': 'FR', ' forfait_type_id ':' 11 ',' Livraison_Label_Created ':' 2018-06-07 09 ',' 51 ':' 45 ',' Montant ':' 2.9 '} code>. Comment ierrai-je à travers les clés de valeur? Par exemple, si je veux saisir toutes les quantités de produits ou des valeurs de pays_stry? Quand toute l'information est déjà placée comme valeur?
Vous pouvez itération via les valeurs telles que celles pour v.values (): code> alors
v code> contiendra chaque transaction dict que vous pouvez alors indexer dans
V [' produit_mount '] code> pour obtenir des valeurs spécifiques.
Ceci serait plus facile à rejoindre si les données brutes d'origine étaient au format «JSON» au lieu de «XML». Si vous téléchargez les données à l'aide d'une API de repos, essayez de transmettre un mot-clé à la fin '& $ format = JSON' et voyez si le résultat du fichier revient en tant que chaîne JSON. Par exemple, cela fonctionnera dans les API de repos SAP, mais je pense que c'est un paramètre standard parmi de nombreux fournisseurs d'API. p>
Partager une expérience que j'avais au travail, on m'a donné une API SAP où la réponse par défaut était XML ... J'ai essayé de donner un sens à celui-ci en utilisant des bibliothèques Python XML Paysing (goutte sans fin de cerveau) jusqu'à ce que je pouvais juste passer Un paramètre sur la chaîne d'URL brute, et il reviendrait comme un Json à la place. Basé sur mon expérience, c'est ma recommandation pour votre problème. p>
Voici un exemple d'une API publique avec la syntaxe ... Essayez d'expérimenter avec des combinaisons similaires pour votre API. P>
https://vpic.nhtsa.dot.gov/api/ p>
https://vpic.nhtsa.dot.gov/api/Home / Index / languageExemples p>
Maintenant, si vous pouvez télécharger une chaîne JSON, il est assez facile de convertir cela en un dictionnaire Python ... Beaucoup de ressources en ligne comment faire cela. Puis convertir du dictionnaire Python en Pandas Dataframe est simple, de nombreuses ressources en ligne comment faire cela. Ensuite, rejoindre plusieurs dataframe ensemble est simple, beaucoup de ressources en ligne comment faire cela. P>
Si vous ne pouvez pas obtenir une chaîne JSON, il existe quelques ressources (plus compliquées) en ligne sur la manière de convertir de XML en JSON. Voici quelques liens: P>
Comment convertir une chaîne XML en un dictionnaire? < / a> p>
https: // EricicCrivner. Moi / 2015/07 / Python-Tip-Convert-XML-Tree-To-A-Dictionnaire / P>
http: //code.Activetate. Com / recettes / 573463-CONVERTISSEMENT-XML-TO-DICINGARY-and-Back / P>
Vous trouverez qu'il est beaucoup plus facile de travailler avec le dictionnaire, plutôt qu'une liste. Une liste est censée stocker des articles commandés, mais votre liste stocke une bande de paires de clés (ce qui est exactement quel dictionnaire est bon pour). P>
espère que cela aide! p>
Merci, je vais regarder ça!
On dirait que d'être un nom de fichier XML, votre source est un JSON, comme mentionné dans une autre réponse, générant des dictionnaires de Json pourrait être plus facile.
En supposant que ce n'est pas possible, le programme suivant passera par votre différence. Listes, essayez d'extraire une carte d'identité de transaction, qui sera utilisée comme clé de notre principale défaillanceDict, qui sera renseignée avec un dict vide, si l'ID n'existait pas ou ajoute une nouvelle entrée dans son dictionnaire sinon. P>
Voici le code complet. Notez que j'ai modifié la deuxième liste pour avoir un identifiant correspondant à la première liste afin de montrer comment les champs des listes séparées pourraient être fusionnés dans le même dict. Cela n'assume aucun chevauchement entre champs. P> voici la sortie donnée: p> je viens de réaliser que la liste3 t avoir un identifiant de transaction, qui est donc ignoré. Quoi qu'il en soit, cela devrait donner l'idée. P> p>
Quelle liste est
FULL_PRODUCT_SHISTMENTS CODE>,
FULL_PROVIDER_INVOICES CODE>, etc ...?
La première liste est
FULL_PRODUCT_INVOICES CODE>, Second List est
FULL_PRODUCT_SHISTMENTS CODE>, la troisième liste est
FULL_PROVIDER_INVOICES CODE>.