某些键下的组值

时间:2013-06-01 09:00:57

标签: python

到目前为止我的代码:

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下的所有值组合在一个密钥下,这是他们共享的共同frame。因此,如果frame 1每次在不同id下的文件中出现100次,我需要一个rect下的所有key,这将有100个不同的{{1}在它里面。

所以一个例子就是:

rect

然后我可以将一个文件中的{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]} frame与另一个文件中的1 frame进行比较。

2 个答案:

答案 0 :(得分:2)

你使用字典的方式对我来说似乎不太合适。

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

这些行会在每个循环中覆盖你的dict,所以你有一个只有一个 key : value对的词典。然后你直接写到输出文件。根本没有排序或分组。

你想要的是什么(如果我理解正确的话)是一个大字典,其中frame为关键字, rects列表为值。 类似的东西:

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

然后你应该创建一个dict。在循环中,您应该获得映射到您的框架的值(dict[frame])。如果还没有此类密钥,请使用rect作为第一个元素创建一个新列表。如果已经有一个列表映射到框架,您应该将rect附加到它。

最后,您可以遍历您的dict并将其写入输出文件。

我希望我能正确理解你,这会有所帮助。

答案 1 :(得分: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]]}