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

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

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)


arrow_upward
1
arrow_downward

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

 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

arrow_upward
2
arrow_downward

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

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

arrow_upward
0
arrow_downward

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