2009-04-29 14 views
1

Ceci est une excellente amorce, mais ne répond pas à ce que je dois: Combining two sorted lists in PythonFusionner deux listes de listes - Python

J'ai deux listes Python, chacun est une liste de datetime, paires de valeurs:

list_a = [['1241000884000', 3], ['1241004212000', 4], ['1241006473000', 11]] 

Et:

list_x = [['1241000884000', 16], ['1241000992000', 16], ['1241001121000', 17], ['1241001545000', 19], ['1241004212000', 20], ['1241006473000', 22]] 
  1. Il y a en fait de nombreuses listes de list_a avec différentes valeurs/clés.
  2. Toutes les dates-dates list_a se trouvent dans list_x.
  3. Je veux faire une liste, list_c, correspondant à chaque liste_a qui a chaque datetime de list_x et value_a/value_x.

Bonus:

Dans mon programme réel, list_a est en fait une liste dans un dictionnaire comme ceci. Prenant la réponse au niveau du dictionnaire serait:

dict = {object_a: [['1241000884000', 3], ['1241004212000', 4], ['1241006473000', 11]], object_b: [['1241004212000', 2]]} 

Je peux comprendre cette partie cependant.

+2

pourquoi utilisez-vous pas des dictionnaires au lieu de listes? – SilentGhost

+0

Je pourrais utiliser un dictionnaire (ou un ensemble comme recommandé ci-dessous). En fin de compte, cependant, il doit être une liste parce que JSON sera à la recherche de cela. Je vais bien avec une réponse dictée. Les réponses ci-dessous ne sont toujours pas 100% même si j'ai fermé la question. –

Répondre

4

Voici un code qui fait ce que vous avez demandé. Vous pouvez transformer votre liste de paires dans un dictionnaire directement. Ensuite, les clés partagées peuvent être trouvées en croisant les ensembles de clés. Enfin, la construction du dictionnaire des résultats est facile compte tenu de l'ensemble des clés partagées.

dict_a = dict(list_a) 
dict_x = dict(list_x) 

shared_keys = set(dict_a).intersection(set(dict_x)) 

result = dict((k, (dict_a[k], dict_x[k])) for k in shared_keys) 
+0

Cela semble bon. Les ensembles pourraient être une option plus facile puisque mon application n'aura pas d'horodatage en double. –

3

"Je veux faire une liste, list_c, correspondant à chaque list_a qui a chaque datetime de list_x et value_a/value_x."

def merge_lists(list_a, list_x): 
    dict_x= dict(list_x) 
    for k,v in list_a: 
     if k in dict_x: 
      yield k, (v, dict_x[k]) 

Quelque chose comme ça peut fonctionner aussi.

merged= list(merge_lists(someDict['object_a'], someDict['object_b']) 

Ceci peut être légèrement plus rapide car il ne fait qu'un dictionnaire pour les recherches et laisse l'autre liste seule.

0

pouvez essayer prolonger:

list_a.extend(list_b) 
2

Rien ne vaut une belle fonctionnelle en une ligne:

reduce(lambda l1,l2: l1 + l2, list) 
Questions connexes