2010-11-17 7 views
2

Je suis nouveau python, et avez une question concernant les colonnes de magasins dans les listes et les convertir au dictionnaire comme suit:Python: stocker les données en deux listes et ensuite convertir en un dictionnaire

J'ai données en deux colonne ci-dessous, avec les noeuds (N) et les bords (E), et je veux d'abord faire une liste de ces deux colonnes et ensuite faire un dictionnaire de ces deux listes comme

{1:[9,2,10],2:[10,111,9],3:[166,175,7],4:[118,155,185]}.

Comment puis-je faire cela? Merci.

N E   
1 9  
1 2  
1 10  
2 10  
2 111  
2 9  
3 166  
3 175  
3 7  
4 118  
4 155  
4 185 

Répondre

6

A defaultdict est une sous-classe de dict qui serait utile ici:

import collections 
result=collections.defaultdict(list) 
for n,e in zip(N,E): 
    result[n].append(e) 
+0

Les données ci-dessus est dans un fichier texte et non dans une liste. Pouvez-vous dire quelle est votre variable 'list' ici? Merci. – Pupil

+0

+1, mais pourrait utiliser une exposition. –

+1

@Harpreet: Le code que j'ai posté peut être utilisé littéralement en supposant que vous avez défini les listes 'N' et' E'. 'collections.defaultdict (list)' crée un objet semblable à un dict de sorte que 'result [key]' soit automatiquement défini pour égaler une 'liste' vide quand' key' n'est pas déjà dans le dict. – unutbu

2
yourDict={} 
for line in file('r.txt', 'r'): 
    k , v = line.split() 
    if k in yourDict.keys(): 
     yourDict[k].append(v) 
    else: 
     yourDict[k] = [v] 

print yourDict 

Sortie: (Vous pouvez toujours supprimer N: E dans le dernier)

{'1': ['9', '2', '10'], '3': ['166', '175', '7'], '2': ['10', '111', '9'], '4': ['118', '155', '185'], 'N': ['E']} 
+0

@Harpreet: Ajouté, comment faire face à un fichier – pyfunc

1

un peu plus lent que la version d'unutbu, mais plus court :)

result = { } 
for n, e in (line.split() for line in open('r.txt')): 
    result[ n ] = result.setdefault(n, [ ]) + [ e ] 
1

Ce fait exactement ce que vous vouliez:

import collections 

N = [] 
E = [] 
with open('edgelist.txt', 'r') as inputfile: 
    inputfile.readline() # skip header line 
    for line in inputfile: 
     n,e = map(int,line.split()) 
     N.append(n) 
     E.append(e) 

dct = collections.defaultdict(list) 
for n,e in zip(N,E): 
    dct[n].append(e) 
dct = dict(dct) 
print dct 
# {1: [9, 2, 10], 2: [10, 111, 9], 3: [166, 175, 7], 4: [118, 155, 185]} 
2

Ce qui suit ne dispose pas d'une boucle sur les bords. Cette itération est gérée en interne par Python en utilisant des méthodes intégrées, et il peut être plus rapide pour les grands graphiques:

import itertools 
import operator 

N = [ 1, 1, 1, 2, 2] 
E = [ 2, 3, 5, 4, 5] 

iter_g = itertools.groupby(zip(N,E), operator.itemgetter(0)) 

dict_g = dict((v, map(operator.itemgetter(1), n)) for v,n in iter_g) 

De plus, si vous avez seulement besoin des données une fois, vous pouvez simplement utiliser iter_g et non construire le dictionnaire.

0

Voici la réponse courte:

l1 = [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4] 
l2 = [9, 2, 10, 10, 111, 9, 166, 175, 7, 118, 155,185] 

d = dict((i,[j for j,k in zip(l2,l1) if k == i]) for i in frozenset(l1)) 
+0

Désolé pour sniping avec la réponse courte et simple. Mais je n'ai pas pu résister. – freegnu

Questions connexes