为了账号安全,请及时绑定邮箱和手机立即绑定

在某些键下分组值

在某些键下分组值

蝴蝶不菲 2021-03-20 14:11:59
到目前为止,我的代码: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 12 109 2 557 1 24 32 12 109 3 557 5 24 32 12 109 4 553 5 28 32 12 109 5 553 1 36 40 1239 195 1 101 549 40 28 1239 195 2 100 549 40 28 1239 195 3 98 549 40 28 1239 195 4 91 551 40 28 1239 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与另一个文件中进行比较。
查看完整描述

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


查看完整回答
反对 回复 2021-03-29
?
慕桂英3389331

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其追加到该列表。


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


希望我能正确理解您,对您有所帮助。


查看完整回答
反对 回复 2021-03-29
  • 3 回答
  • 0 关注
  • 157 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信