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

过滤txt文件在python中满足某些条件?

过滤txt文件在python中满足某些条件?

哆啦的时光机 2021-11-09 10:58:31
我有一个包含subjectid_num_[dog/cat]_[option]的 txt 文件。ID1_0123_CAT_ANIMAL_3ID1_0123_CAT_ANIMAL_GOOD_3ID1_0123_ABC_3ID2_1234_CAT_ANIMAL_3ID2_1234_CAT_ANIMAL_GOOD_3ID2_1234_DOG_ANIMAL_2ID2_1234_DOG_ANIMAL_GOOD_0ID2_1234_ABCD_3ID3_4321_DOG_ANIMAL_1ID3_4321_DOG_ANIMAL_GOOD_4ID3_4321_DOG_3我想过滤文件以获得满足条件的输出。例如,下面的代码将文件的输出具有CAT和GOOD的名义,并且不包含DOG与GOOD在名称中。名称由相同subject_id和相同的数字确定num。但是,代码没有显示我的预期输出。我该如何解决?这是我的代码with open("./cat_dog.txt", 'r') as f:    files_list = [line.rstrip('\n') for line in f]file_filter = []for i, cat in enumerate(files_list):    if 'GOOD' in cat and 'CAT' in cat:        subject_id = cat.split('_')[0]        num_id = cat.split('_')[1]        subject_num = subject_id + '_' + num_id        for j, dog in enumerate(files_list):                if subject_num in dog and 'GOOD' in dog:                    if 'GOOD' in dog and 'DOG' in dog:                        continue;                    else:                        file_filter.append(cat)当前输出为ID1_0123_CAT_ANIMAL_GOOD_3ID2_1234_CAT_ANIMAL_GOOD_3虽然预期是ID1_0123_CAT_ANIMAL_GOOD_3
查看完整描述

1 回答

?
互换的青春

TA贡献1797条经验 获得超6个赞

你的代码是错误的。考虑ID2_1234_CAT_ANIMAL_GOOD_3在内循环中检查行时会发生什么:


subject_id = cat.split('_')[0]            #ID2

num_id = cat.split('_')[1]                # 1234

subject_num = subject_id + '_' + num_id   #ID2_1234

for j, dog in enumerate(files_list):

        # when dog is the line ID2_1234_CAT_ANIMAL_GOOD_3

        if subject_num in dog and 'GOOD' in dog:   # this is true

            if 'GOOD' in dog and 'DOG' in dog:   # this is false

                continue;

            else:

                file_filter.append(cat)   # then it outputs it

问题是,每行GOOD,并CAT在将“匹配本身”的内循环。


恕我直言,我会使用itertools.groupby。类似的东西:


from itertools import groupby


def key(line):

    return line.split('_')[:2]


for key, lines in groupby(sorted(files_list, key=key), key=key):

    good_lines = [line for line in lines if 'GOOD' in line]

    if len(good_lines) == 1 and 'CAT' in good_lines[0]:

        file_filter.append(good_lines[0])

这也应该是更有效的 O(nlog n) 与 O(n^2) 相比,尽管它需要 RAM 中文件的所有内容。


如果您有除CATand以外的其他“类” ,DOG并且您想输出GOOD CAT除subject_idis之外的所有行,GOOD DOG您可以通过以下方式修改上面的代码:


is_good_cat = any('CAT' in line for line in good_lines)

is_good_dog = any('DOG' in line for line in good_lines)

if is_good_cat and not is_good_dog:

    file_filter.extend(line for line in good_lines if 'CAT' in good_lines)

(你需要使用.extend和循环,因为我们不再知道要写哪一行,所以你必须过滤它们。


查看完整回答
反对 回复 2021-11-09
  • 1 回答
  • 0 关注
  • 230 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号