Как создать словарь со столбцами, заданными как ключи и значения

Итак, мне дано два столбца

A S

A T

A Z

B F

B G

B P

B U

C D

C P

C R

D M

E H

F S

H U

1-й столбец — это список точек, а второй столбец — это список соседей точек. Я хотел бы сделать его словарем, чтобы {A: 'S', 'T', 'Z', B: 'F', 'G', 'P' и т. д.} и так далее.

То, что я пытался сделать, это то, что текстовый файл состоит из двух столбцов.

edges = open('romEdges.txt')

edgeslist = edges.read().split()

edgeskeys = edgeslist[::2]

edgesvalues = edgeslist[1::2]


dictionary = {}

for items in edgeskeys:

    dictionary[items]=[]

dictionary = OrderedDict(sorted(dictionary.items(), key=lambda t: t[0]))

for items in edgeskeys:

    if edgeskeys[items]==dictionary[items]:

        print()

print(dictionary)

Я попытался сделать 2 списка, 1 из ключей и 1 из значений, и попытался сравнить их со словарем и т. д., и я просто не могу понять это правильно!

ДОЛЖЕН быть простой способ.

Пожалуйста помоги.


person CyanogenCX    schedule 30.10.2014    source источник


Ответы (3)


Для людей, которые просто хотят создать простой словарь из столбцов без повторяющихся ключевых значений, это должно работать:

 edges = open('romEdges.txt')
 dict = {line[:1]:line[1:] for line in edges}
 print dict
 edges.close()

теперь у вас, возможно, есть пробелы или Backspaces в значениях, тогда вы можете replace() с пустыми строками:

 edges = open('romEdges.txt')
 dict = {line[:1]:line[1:].split()[0] for line in edges}
 print dict
 edges.close()

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

 edges = open('romEdges.txt')
 dict = {line[:1]:line[1:].split() for line in edges}
 print dict
 edges.close()
person muthan    schedule 30.10.2014
comment
Я попытался запустить это, но все ключи имели только одно значение, тогда как некоторые из них должны иметь несколько значений. Спасибо за ваши усилия. - person CyanogenCX; 30.10.2014
comment
Итак, вы знаете, как это сделать «правильно»? редактировать: другой пользователь помог. в любом случае спасибо! - person CyanogenCX; 30.10.2014
comment
нет проблем, для вашей следующей проблемы посмотрите мой 3-й ответ без [0]. Проблема с моим решением заключалась в том, что вам нужно было добавить список, чего вы не можете сделать в однострочном генераторе диктов. Я знаю - person muthan; 30.10.2014
comment
я обобщил свой ответ для людей, которые приходят сюда, чтобы искать эту проблему в целом - person muthan; 30.10.2014
comment
так вы имеете в виду проблему с 3 столбцами, которую я прокомментировал в другом ответе? редактировать: вау спасибо! Это сработало! - person CyanogenCX; 30.10.2014
comment
Спасибо, приятель, я хотел бы дать вам обоим лучший ответ, потому что вы действительно многим помогли. К сожалению, он смог помочь мне с оригинальным ответом, но вы помогли мне с не менее важной проблемой. Спасибо! Я просто дам тебе лучший ответ, так как у тебя меньше репутации, чем у него :p - person CyanogenCX; 30.10.2014

Почему бы не просто построчную обработку?

f = open('romEdges.txt')
dic = {}
for l in f:
    k, v = l.split()
    if k in dic:
        dic[k].extend(v)
    else:
        dic[k] = [v]
f.close()
print dic

Вывод из вашего ввода:

{'A': ['S', 'T', 'Z'], 'C': ['D', 'P', 'R'], 'B': ['F', 'G', 'P', 'U'], 'E': ['H'], 'D': ['M'], 'F': ['S'], 'H': ['U']}
person hushaohan    schedule 30.10.2014
comment
'dict' не имеет атрибута 'has_key' - person CyanogenCX; 30.10.2014
comment
В этом случае используйте k in dic вместо dic.has_key(k). - person hushaohan; 30.10.2014
comment
Да, я понял это прямо сейчас. Спасибо за вашу помощь. Ваш ответ работает! - person CyanogenCX; 30.10.2014
comment
Как бы вы сделали то же самое, если бы вам дали 3 столбца, 2-й и 3-й столбцы были значениями для 1-го столбца, за исключением того, что на этот раз в 1-м столбце ничего не повторяется? - person CyanogenCX; 30.10.2014

f = open('romEdges.txt')

dic = {}

для l в f:

k, v = l.split('\t')
dic.setdefault(k,[])
if k in dic.keys():
    dic[k].extend([v.strip()])
else:
    dic[k] =[v]
f.close()

print dic
person chandra    schedule 19.01.2015