猿问

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

我有一个包含subjectid_num_[dog/cat]_[option]的 txt 文件。


ID1_0123_CAT_ANIMAL_3

ID1_0123_CAT_ANIMAL_GOOD_3

ID1_0123_ABC_3

ID2_1234_CAT_ANIMAL_3

ID2_1234_CAT_ANIMAL_GOOD_3

ID2_1234_DOG_ANIMAL_2

ID2_1234_DOG_ANIMAL_GOOD_0

ID2_1234_ABCD_3

ID3_4321_DOG_ANIMAL_1

ID3_4321_DOG_ANIMAL_GOOD_4

ID3_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_3

ID2_1234_CAT_ANIMAL_GOOD_3


虽然预期是


ID1_0123_CAT_ANIMAL_GOOD_3


哆啦的时光机
浏览 231回答 1
1回答

互换的青春

你的代码是错误的。考虑ID2_1234_CAT_ANIMAL_GOOD_3在内循环中检查行时会发生什么:subject_id = cat.split('_')[0]            #ID2num_id = cat.split('_')[1]                # 1234subject_num = subject_id + '_' + num_id   #ID2_1234for 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 groupbydef 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和循环,因为我们不再知道要写哪一行,所以你必须过滤它们。
随时随地看视频慕课网APP

相关分类

Python
我要回答