2014-10-16 4 views
-1

У меня есть два файла, у которых есть ключ, а у другого есть как ключ, так и значение. Я должен сопоставить ключ файла и вытащить соответствующее значение из файла два. Когда весь ключ и значение находятся в формате простого столбца, я могу получить ключ и значение для нового файла очень хорошо. Но я не понимаю, как получить результат, когда значение находится в типе set/array.Dict и List Manipulation Python

Входной один в формате колонки:

5216 3911 2 761.00 
2503 1417 13 102866.00 
5570 50 2 3718.00 
5391 1534 3 11958.00 
5015 4078 1 817.00 
3430 299 1 5119.00 
4504 3369 2 3218.00 
4069 4020 2 17854.00 
5164 4163 1 107.00 
3589 3026 1 7363.00 

Входной два в формате колонки. Они являются ключевыми, как пара, т.е. col[0] и col[1] и являются ключевыми парами

5391 1534 
5015 4078 
3430 299 
4504 3369 

Вывод для приведенного выше входного случае, который является правильным для меня

5391 1534 3 11958.00 
5015 4078 1 817.00 
3430 299 1 5119.00 
4504 3369 2 3218.00 

Программа

from collections import defaultdict 

edges = {} 
with open('Input_1.txt', 'r') as edge_data:  
    for row in edge_data: 
     col = row.strip().split() 
     edges[col[0], col[1]] = col[2], col[3] 
#Then to do the queries, read through the first file and print out the matches: 
with open('Input_2', 'r') as classified_data: 
    with open ('Output', 'w') as outfile:  
    for row in classified_data: 
      a,b = row.strip().split() 
     c = edges.get((a,b), edges.get((b,a))) 

     #print a,b, edges.get((a,b), edges.get((b,a))) 
     #print a,b,c   
     outfile.write("%s %s %s\n" % (a,b,c)) 

выше программа отлично подходит для вышеупомянутых типов ввода. Но я понятия не имею, как получить операции для следующих данных.

Я понимаю, что я должен изменить это утверждение из вышеуказанной программы, но я не понимаю, к чему это следует изменить?

edges[col[0], col[1]] = col[2], col[3] 

Новый Входной один

('3350', '2542') [6089.0, 4315.0] 
('2655', '1411') [559.0, 1220.0, 166.0, 256.0, 146.0, 528.0, 1902.0, 880.0, 2317.0, 2868.0] 
('4212', '1613') [150.0, 14184.0, 4249.0, 1250.0, 10138.0, 4281.0, 2846.0, 2205.0, 1651.0, 335.0, 5233.0, 149.0, 6816.0] 
('4750', '2247') [3089.0] 
('5305', '3341') [13122.0] 

New Input два Они являются ключевыми, как пара, т.е. col[0] и col[1] как являются ключевыми парами

3350 2542 
4750 2247 
5305 3341 

Ожидаемый выход

3350 2542 6089.0 
3350 2542 4315.0 
4750 2247 3089.0 
5305 3341 13122.0 
+0

Каков реальный выход? –

+0

@TimCastelijns Включено несколько деталей. –

+1

Запрос всем, если вы не понимаете, или если вы не хотите отвечать, пожалуйста, не беспокойтесь, но по крайней мере не ставьте неверные/закрытые флаги. Возможно, это не важно для вас, но решение для меня действительно важно для меня. –

ответ

0

Я думал @ three_pineapples eval манера игровой неплох и блестящий,

Вот альтернативная один, который только манипулировать строку:

edges = {} 
with open("Input_1.txt", "r") as edge_data: 
    for row in edge_data: 
     k, v = row.strip().split(")") # split as key, value 
     k = " ".join(i.strip("'") for i in k.strip("(").split(", ")) # clean unwanted symbol and merge together 
     v = v.strip(" []").split(", ") # get list value 
     edges[k] = v 

with open("Input_2", "r") as classified_data: 
    for row in classified_data: 
     k = row.strip(); 
     for v in edges.get(k, []): 
      print k, v 
+0

Это замечательно .. Именно то, за что я боролся. –

0

Использовать p attern соответствие

import re 
rec = re.compile(r"\('(\d+)',\s*'(\d+)'\)\s*\[(.*)\]") 
matches = rec.match("('3350', '2542') [6089.0, 4315.0]") 
print matches.groups() 
print int(matches.group(1)) 
print int(matches.group(2)) 
print map(float, matches.group(3).split(',')) 

Выход

('3350', '2542', '6089.0, 4315.0') 
3350 
2542 
[6089.0, 4315.0] 

Чтобы сохранить данные

a = int(matches.group(1)) 
b = int(matches.group(2)) 
data = map(float, matches.group(3).split(',')) 
edges[a,b] = data 

Чтобы получить данные и распечатать вывод

c = edges.get((a,b), edges.get((b,a))) 
for value in c: 
    print "%s %s %s\n" % (a,b, value) 
+0

Спасибо за ответ, но '3350 ',' 2542'', поскольку пара - это ключ, а' 6089.0' - одно значение пары, а '4315.0' - второе значение той же пары. –

+2

Yup, как и в вашем старшем коде, вы использовали 'col [0], col [1]' as tuple use 'group (1), group (2)' как tuple: D (у меня есть обновленный ответ, значение - это список) – Anshul

+1

Не могли бы вы прочитать ожидаемый результат –

0

Я предложил бы разделив строку на другом керараке тер, скажем ')'

Так что вы могли бы сделать что-то вроде:

with open('Input_1.txt', 'r') as edge_data:  
    for row in edge_data: 
     col = row.strip().split(')') 

Затем вы хотите преобразовать строковое представление набора и список, в чем-то вы можете работать с.Вы можете сделать это с помощью eval()

 key = eval(col[0]+')') # note I add the bracket back in that we split on 
     value = eval(col[1]) 
     edges[key] = value 

Теперь у вас есть словарь edges с ключами, которые соответствуют кортеж в одном файле и значения, которые содержат связанные списки

Когда вы читаете в файле 2, вам нужно будет для добавления еще одного цикла, который выполняет итерацию по элементам в списке. Например, что-то вроде

for c in edges[(a,b)]: 
    outfile.write("%s %s %s\n" % (a,b,c)) 

Это позволит Вам писать в свой выходной файл для каждой записи в списке, вы читали в из первого файла.

+1

. Я немного смущен здесь :(Но спасибо за ваш ответ. –

+0

@SitzBlogz Что именно вы находите в замешательстве? Я специально не ложкой кормил вас ответом вы можете скопировать/вставить, чтобы вы могли чему-то научиться. –