3 回答
TA贡献1799条经验 获得超9个赞
这分两个步骤进行,并将中间输出按所需顺序排序。请注意,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]]}
TA贡献2036条经验 获得超8个赞
您使用字典的方式对我来说似乎不太正确。
dict = {frame:[id, rect]}
fout.writelines(str(dict)+'\n')
这些行会在每个循环中覆盖您的字典,因此您只有一 key : value对字典。然后,将其直接写入输出文件。根本没有排序或分组。
您想要的(如果我对您没错的话)是一本大字典,以frame键作为键,并以rects列表作为值。就像是:
frame | rects
1 | [rect1, rect2]
2 | [rect3, rect4, rect5]
然后,您应该创建一个字典。在循环中,您应该将值映射到框架(dict[frame])。如果还没有这样的密钥,请以您rect的第一个元素创建一个新列表。如果已经有一个列表映射到框架,则应将rect其追加到该列表。
最后,您可以遍历字典并将其写入输出文件。
希望我能正确理解您,对您有所帮助。
添加回答
举报