2013-06-01 4 views
1

Моего кода до сих пор:значение Группы под определенным ключом

from collections import OrderedDict as od 
    def load(fileIn, fileOut): 
     with open(fileIn+'.txt') as fin, open(fileOut+'.txt', 'w') as fout: 
      dict = od() 
      for line in fin: 
       row = line.split() 
       id = int(row[0]) 
       frame = int(row[2]) 
       rect = [int(row[3]),int(row[4]),int(row[5]),int(row[6])] 
       dict = {frame:[id, rect]} 
       fout.writelines(str(dict)+'\n') 

считывает из текстового файла, сортирует его определенным образом и записывает его на новый. Мне нужно добавить еще один цикл for или, возможно, еще два, поэтому я могу сортировать его лучше, прежде чем писать, и это то, где я боюсь.

Вот входные и выходные примеры, чтобы сделать вещи более ясно:

Вход:

2 109 1 561 1 20 28 1 
2 109 2 557 1 24 32 1 
2 109 3 557 5 24 32 1 
2 109 4 553 5 28 32 1 
2 109 5 553 1 36 40 1 
239 195 1 101 549 40 28 1 
239 195 2 100 549 40 28 1 
239 195 3 98 549 40 28 1 
239 195 4 91 551 40 28 1 
239 195 5 93 549 40 28 1 

Выход:

{1: [2, [561, 1, 20, 28]]} 
{2: [2, [557, 1, 24, 32]]} 
{3: [2, [557, 5, 24, 32]]} 
{4: [2, [553, 5, 28, 32]]} 
{5: [2, [553, 1, 36, 40]]} 
{1: [239, [101, 549, 40, 28]]} 
{2: [239, [100, 549, 40, 28]]} 
{3: [239, [98, 549, 40, 28]]} 
{4: [239, [91, 551, 40, 28]]} 
{5: [239, [93, 549, 40, 28]]} 

Я пытаюсь группировать все значения из разные rect s под одним ключом, который является общим frame все они разделяют. Так что если frame 1 появляется 100 раз в файле под разными id каждый раз, мне нужно все rect s под одним key, которое будет содержать 100 разных rect s.

Так пример того, что будет:

{1:[rect],[rect],[rect],[rect],[rect],[rect],[rect],[rect],[rect]} 
{2:[rect],[rect],[rect],[rect],[rect],[rect],[rect],[rect],[rect]} 
{3:[rect],[rect],[rect],[rect],[rect],[rect],[rect],[rect],[rect]} 

Тогда я могу сравнить frame1 в одном файле, чтобы frame1 в другом файле.

+0

Вы не делаете любую группировку ожидаемых результатов. –

+0

@Ashwini Chaudhary Что значит? Каждый dict, который имеет один и тот же фрейм, будет иметь свою группу сгруппирован со всеми другими прямоугольниками, которые имеют тот же самый кадр, что и их ключ, удаляя все остальные дубликаты ключей. – MaxPower

ответ

2

Это делается в два этапа и сортирует промежуточный выход в желаемом порядке. Обратите внимание, что id каждого прямоугольника игнорируется, так как он не находится в конечном результате, указанном в вашем вопросе.

from collections import defaultdict 

def load(fileIn, fileOut): 
    with open(fileIn+'.txt') as fin: 
     frame_rects = defaultdict(list) 

     for row in (map(int, line.split()) for line in fin): 
      frame, rect = row[2], [row[3],row[4],row[5],row[6]] 
      frame_rects[frame].append(rect) 
     fin.close() 
     with open(fileOut+'.txt', 'w') as fout: 
      for frame, rects in sorted(frame_rects.iteritems()): 
       fout.write('{{{}:{}}}\n'.format(frame, rects)) 

load('filein', 'fileout') 

Выход:

{1:[[561, 1, 20, 28], [101, 549, 40, 28]]} 
{2:[[557, 1, 24, 32], [100, 549, 40, 28]]} 
{3:[[557, 5, 24, 32], [98, 549, 40, 28]]} 
{4:[[553, 5, 28, 32], [91, 551, 40, 28]]} 
{5:[[553, 1, 36, 40], [93, 549, 40, 28]]} 
2

То, как вы используете словарь, кажется мне не совсем правильным.

dict = {frame:[id, rect]} 
fout.writelines(str(dict)+'\n') 

Эти строки перезаписать Dict в каждом цикле, поэтому у вас есть Dict только с однимkey : value пары. Затем вы пишете это прямо на ваш выходной файл. Нет сортировки или группировки вообще.

То, что вы хотите (если я правильно понял) это один большой словарь, с frame как ключ и список прямоугольникам как значение. Что-то вроде:

frame | rects 
    1 | [rect1, rect2] 
    2 | [rect3, rect4, rect5] 

Затем вы должны создать один Dict. В цикле вы должны получить значение, сопоставленное с вашим фреймом (dict[frame]). Если такого ключа еще нет, создайте новый список с rect в качестве первого элемента. Если уже есть список, сопоставленный с фреймом, вы должны добавить к нему свой rect.

В конце вы можете перебирать свой dict и записывать его в выходной файл.

Надеюсь, я правильно понял вас, и это помогает.

Смежные вопросы