4 votes

Problème de combinaison de deux tuples dans un dictionnaire

J'ai une liste d'identifiants entiers triés comme suit

[1, 2, 10, 15, 16, 17, 20, 34, ...]

J'ai un tuple (tuple1) de tuples de codes à côté d'un ID trié par ID comme suit

((1, "A"), (2, "A"), (15, "B"), (16, "A"), (17, "B"), (34, "B"), ...)

J'ai un autre tuple (tuple2) de tuples dans le même format que le suivant

((1, "B"), (2, "B"), (10, "B"), (16, "A"), (17, "B"), (34, "B"), ...)

Je souhaite combiner les tuples dans un dictionnaire dont la clé est l'ID et la valeur est une liste contenant le code du tuple1 et le code du tuple2 dans cet ordre. Si l'identifiant existe dans la liste des identifiants mais pas dans le tuple, la valeur doit être la suivante "N/A" .

Par conséquent, en utilisant les données ci-dessus, les résultats suivants devraient être obtenus :

{1: ["A", "B"], 2: ["A", "B"], 10: ["N/A", "B"], 15: ["B", "N/A"],
 16: ["A", "A"], 17: ["B", "B"], 20: ["N/A", "N/A"], 34: ["B", "B"]}

J'ai passé pas mal de temps à réfléchir à ce problème, mais je n'ai pas trouvé de solution. Si quelqu'un pouvait m'aider à trouver comment le faire fonctionner en Python, ce serait extrêmement utile.

Merci.

EDIT : Il ne s'agit pas d'un doublon Ce problème est beaucoup plus complexe.

10voto

busybear Points 3845

Si vous transformez votre tuple de tuples en dictionnaire, ce sera beaucoup plus facile. Utiliser get pour définir une valeur par défaut pour votre dictionnaire si la clé est absente :

ids = [1, 2, 10, 15, 16, 17, 20, 34]
tup1 = ((1, "A"), (2, "A"), (15, "B"), (16, "A"), (17, "B"), (34, "B"))
tup2 = ((1, "B"), (2, "B"), (10, "B"), (16, "A"), (17, "B"), (34, "B"))

tup1 = dict(tup1)
tup2 = dict(tup2)    
{k: [tup1.get(k, 'N/A'), tup2.get(k, 'N/A')] for k in ids}

3voto

Christian G. Points 166

Voici une solution possible à ce problème :

from collections import defaultdict

keys = [1, 2, 10, 15, 16, 17, 20, 34]

t1 = ((1, "A"), (2, "A"), (15, "B"), (16, "A"), (17, "B"), (34, "B"))
t2 = ((1, "B"), (2, "B"), (10, "B"), (16, "A"), (17, "B"), (34, "B"))

merge_d = defaultdict(list)
for d in map(dict, (t1, t2)):
    for k in keys:
        merge_d[k].append(d.get(k, "N/A"))

Le dict résultant contiendra :

>>> merge_d
defaultdict(<class 'list'>, {1: ['A', 'B'], 2: ['A', 'B'], 10: ['N/A', 'B'], 15: ['B', 'N/A'], 16: ['A', 'A'], 17: ['B', 'B'], 20: ['N/A', 'N/A'], 34: ['B', 'B']})

0voto

C'est un peu grossier, mais vous pouvez le faire sans convertir en dictionnaire :

myList = [1, 2, 10, 15, 16, 17, 20, 34]
tuples1 = ((1, "A"), (2, "A"), (15, "B"), (16, "A"), (17, "B"), (34, "B"))
tuples2 = ((1, "B"), (2, "B"), (10, "B"), (16, "A"), (17, "B"), (34, "B"))

myDict = {} 

for i in myList:
    myDict[i] = ["N/A","N/A"] 

for t in tuples1: 
    if(t[0]) in myList:
        for key in myDict:
            if key == t[0]:
                myDict[key][0] = t[1]

for t in tuples2: 
    if(t[0]) in myList:
        for key in myDict:
            if key == t[0]:
                myDict[key][1] = t[1]

print(myDict)

Donne :

{1 : ['A', 'B'], 2 : ['A', 'B'], 10 : ['N/A', 'B'], 15 : ['B', 'N/A'], 16 : ['A', 'A'], 17 : ['B', 'B'], 20 : ['N/A', 'N/A'], 34 : ['B', 'B']}.

0voto

Kartikeya Sharma Points 1131

Cela peut être fait d'une autre manière !

lis=[1, 2, 10, 15, 16, 17, 20, 34]
tuple1=((1, "A"), (2, "A"), (15, "B"), (16, "A"), (17, "B"), (34, "B"))
tuple2=((1, "B"), (2, "B"), (10, "B"), (16, "A"), (17, "B"), (34, "B"))

z={**dict.fromkeys(lis,'N/A'), **dict(tuple1)}
y={**dict.fromkeys(lis, 'N/A'), **dict(tuple2)}    

ds = [z, y]
d = {}
for k in y.keys():
    d[k] = list(d[k] for d in ds)

0voto

PieCot Points 354

Mes deux cents : une solution en une ligne, basée sur la réponse de @busybear, capable de gérer un nombre arbitraire de tuples :

ids = [1, 2, 10, 15, 16, 17, 20, 34]
vals = (
    ((1, "A"), (2, "A"), (15, "B"), (16, "A"), (17, "B"), (34, "B"),),
    ((1, "B"), (2, "B"), (10, "B"), (16, "A"), (17, "B"), (34, "B"),),
)

d = {i: [d.get(i, 'N/A') for d in map(dict, vals)] for i in ids}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X