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]]}

我试图将不同rects 的所有值归为一个键,这是frame它们共享的共同点。因此,如果1每次都frame在不同的文件中出现 100 次,我需要一个下的所有 s,其中将有 100 个不同的 s。idrectkeyrect

所以一个例子是:

{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 1中比较另一个文件。

4

2 回答 2

2

您使用字典的方式对我来说似乎不太正确。

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

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

你想要的(如果我理解正确的话)是一本大字典,其中frame作为键和一个矩形列表作为值。就像是:

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

然后你应该创建一个字典。在循环中,您应该将值映射到您的框架 ( dict[frame])。如果还没有这样的键,请使用您rect的第一个元素创建一个新列表。如果已经有一个映射到框架的列表,您应该将您的列表附加rect到它。

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

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

于 2013-06-01T09:27:20.600 回答
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]]}
于 2013-06-01T10:29:15.130 回答