Python: сохранить данные в два списка, а затем преобразовать в словарь - PullRequest
2 голосов
/ 17 ноября 2010

Я новичок в python, и у меня есть вопрос относительно сохранения столбцов в списках и преобразования их в словарь следующим образом:

У меня есть данные в двух столбцах, показанных ниже, с узлами (N) и ребрами (E), и я хочу сначала составить список этих двух столбцов, а затем сделать словарь этих двух списков как

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

Как я могу это сделать?Спасибо.

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

Ответы [ 6 ]

6 голосов
/ 17 ноября 2010

A defaultdict - это подкласс dict, который будет полезен здесь:

import collections
result=collections.defaultdict(list)
for n,e in zip(N,E):
    result[n].append(e)
2 голосов
/ 18 ноября 2010

Следующее не имеет цикла for по краям.Эта итерация обрабатывается внутри Python с использованием встроенных методов, и она может быть быстрее для больших графов:

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 )

Кроме того, если вам нужны данные только один раз, вы можете просто использовать iter_g и не создаватьсловарь.

2 голосов
/ 17 ноября 2010
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

Вывод: (Вы всегда можете удалить N: E в последнем)

{'1': ['9', '2', '10'], '3': ['166', '175', '7'], '2': ['10', '111', '9'], '4': ['118', '155', '185'], 'N': ['E']}
1 голос
/ 17 ноября 2010

Это именно то, что вы хотели:

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]}
1 голос
/ 17 ноября 2010

немного медленнее, чем версия unutbu, но короче:)

result = { }
for n, e in ( line.split( ) for line in open( 'r.txt' ) ):
    result[ n ] = result.setdefault( n, [ ] ) + [ e ]
0 голосов
/ 21 ноября 2010

Вот краткий ответ:

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...