在某些键下分组值

到目前为止,我的代码:


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它们共同的共同点。因此,如果frame1id每次在不同的文件中出现100次,则我需要一个下的所有rects,key其中将有100个不同的rects。


因此,一个例子是:


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


蝴蝶不菲
浏览 158回答 3
3回答

扬帆大鱼

这分两个步骤进行,并将中间输出按所需顺序排序。请注意,id每个矩形的都将被忽略,因为它不在您问题中显示的最终输出中。from collections import defaultdictdef 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]]}

慕桂英3389331

您使用字典的方式对我来说似乎不太正确。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其追加到该列表。最后,您可以遍历字典并将其写入输出文件。希望我能正确理解您,对您有所帮助。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python