0
votes

Fusion de deux dictionnaires en python avec une clé composée de deux valeurs

J'ai des données comme - xxx

- stockées dans un dictionnaire - xxx

- etc.

Maintenant, j'ai un type de valeur différent, valeur nommée 2 - xxx

- que j'ai à nouveau mis dans un dictionnaire, Xxx

Comment puis-je fusionner ces deux dictionnaires à Python? Les touches, par exemple ("échantillon 1 '," domaine 1 ") sont les mêmes pour les deux dictionnaires.

Je pense que cela ressemble - < Pré> xxx

- etc.


12 commentaires

Qu'attendez-vous que ces deux dictionnaires "fusionnés" devraient ressembler?


Dupliqué possible de Comment fusionner deux dictionnaires dans une seule expression? < / a>


@Jaredsmith: pas un duplicata (de cette question en tout état de cause); Celui-ci semble vouloir conserver les valeurs des deux dict s, ne conserve pas la dernière valeur d'une touche donnée.


Qu'entendez-vous par «fusion»? Quelle est la sortie attendue (exemple concret)?


Alors, que voulez-vous que la dicte fusionnée ait avec la collision des clés? Devrait («échantillon 1», «domaine 1») être mappé sur la valeur 1 ou la valeur 2?


Les deux valeurs doivent être ajoutées à la même clé.


Pouvez-vous utiliser un fonctionnement de type en ligne de réduction directement dans votre requête? Utilisez une Lambda pour ajouter des listes d'un élément contenant ces valeurs ensemble. Une option ...


Sans voir les deux requêtes Sparql, il est impossible de dire si une seule requête serait possible ...


Pour chaque point de données, j'ai besoin du nom de l'échantillon, du domaine des protéines et de deux scores attachés. Je suis désolé, je ne peux pas être plus précis.


Il n'est pas possible de combiner 2 questions. - Union ?


Alors que les réponses ci-dessous répondent à votre question sur "Fusion des dictionnaires à Python" (et suggérez SPARQL doit être supprimée des balises de questions), je pense que vous êtes tombé dans le piège de la XY Problème . Il est presque certain que vous pouvez utiliser une seule requête SPARQL pour obtenir les quatre colonnes de solution que vous désirez (nom d'échantillonnage, domaine protéique, score 1, score 2), mais nous ne pouvons pas vous dire comment, sans voir les deux requêtes que vous utilisez. à présent.


Peut-être, mais ce n'est pas la portée de cette question.


4 Réponses :


-1
votes
{('sample 1', 'domain 1'): [1, 3],
 ('sample 1', 'domain 2'): [2, 4]})

1 commentaires

Ce n'est pas la façon dont chaîne fonctionne ... La structure de boucle imbriquée n'a aucun sens du tout ici.



1
votes

Vous pouvez utiliser une intersection définie des clés pour le faire:

{k: (dict_1.get(k, dict_2.get(k)), dict_2.get(k, dict_1.get(k))) for k in dict_1.keys() | dict_2.keys()}


1 commentaires

@RoadRunner: ou pour l'amusement (ou sérieusement pour certains scénarios vraiment ésotériques), vous pouvez faire chaque obtenir s défaut la valeur de l'autre dict , donc si seulement un dict A la clé, vous obtenez un tuple avec la même valeur deux fois: {k: (dict_1.get (k, dict_2.get (k)), dict_2.get (k, dict_1. obtenez (k)))) pour K dans dict_1.keys () | dict_2.keys ()} :-) Un peu de gaspillage, mais inoffensif.



0
votes

fait quelque chose à la main comme ce travail pour vous? XXX


1 commentaires

Désolé. Avez-vous essayé de remplacer DICT1 et DICT2 avec votre nom de dictionnaires? Êtes-vous sûr que les deux dictionnaires ont les mêmes clés?



2
votes

Le plus proche que vous êtes susceptible d'arriver à ce que ce soit soit un dict code> de la liste code> s (ou définir code> s). Pour la simplicité, vous êtes habituellement Go avec collections.defaultDict (liste) code> , donc vous ne vérifiez pas constamment si la clé existe déjà. Vous devez mapper vers un type de collection comme valeur car dict code> s a des touches uniques, vous devez donc une bonne manière de regrouper les multiples valeurs que vous souhaitez stocker pour chaque touche.

final_dict = {k: tuple(v) for k, v in final_dict.items()}


4 commentaires

Ce serait le moyen le plus propre de le faire sans souffrir de KeyeRors. +1


La première solution semble fonctionner pour moi (étrangement, la seconde ne le fait pas). Je n'ai simplement besoin que les valeurs soient prêtes à être traquées les unes contre les autres. MISSIVE MERCI!


@Dymphy: Pour être clair, le deuxième bloc devrait toujours inclure l'importation pour defaultDict et l'initialisation du fichier vide final_dict à partir du premier bloc. Je les ai omis pour la brièveté, mais final_dict doit toujours être un defaultDict (liste) dans les deux cas. Le deuxième bloc vient de montrer un moyen de réduire le niveau d'imbrication de la boucle. Si vous ajoutez les importations et la définition initiale de final_dict ne font pas la deuxième boucle, faites-moi savoir (et de fournir l'erreur), car cela devrait être exactement équivalent.


Oui, c'était bien le problème. Merci de votre aide!