我有一个包含以下内容的文件,

finalInjectionList是输入文件:[0,2,3] [0,2,3,4] [0,3] [1,2,4] [2,3] [2,3,4]

这里[0,2,3,4]和[1,2,4]是我的问题的最佳超集,我想将它们写入输出文件。因为那些是其他元素的超集,而不是任何行的子集。

我的代码:

import ast
import itertools

def get_data(filename):
    with open(filename, 'r') as fi:
        data = fi.readlines()
    return data

def get_ast_set(line):
    return set(ast.literal_eval(line))

def check_infile(datafile, savefile):
    list1 = [get_ast_set(row) for row in get_data(datafile)]
    print(list1)
    outlist = []

    #for i in range(len(list1)):
    for a, b in itertools.combinations(list1, 2):
       if a.issuperset(b):
            with open(savefile, 'a') as fo:
                  fo.writelines(str(a))

if __name__ == "__main__":
    datafile = str("./finalInjectionList")
    savefile = str("./filteredSets" )
    check_infile(datafile, savefile)



我的代码会写入所有超集,例如也写入{2,3,4}。但是{0,2,3,4}已经覆盖{2,3,4},所以我不想将{2,3,4}写入输出文件。

有什么建议吗?

最佳答案

使用itertools.combinations在for循环中的逻辑有些缺陷,因为它会创建一个组合(((2,3,4},(2,3)),其中(2,3,4)是超集。

如果它们是另一个项目的子集,我将通过从列表中删除它们来解决问题。

import itertools
import ast

with open(r"C:\Users\jeevan.sandhu\Desktop\test.txt", 'r') as f:
    data = f.readlines()

data = [d.replace('\n','') for d in data]

data = [set(ast.literal_eval(d)) for d in data]

data.sort(key=len)

data1 = data
for d in data:
    flag = 0
    for d1 in data1:
        print(d, d1)
        if d == d1:
            print('both sets are same')
            continue
        if d.issubset(d1):
            print(str(d) + ' is a subset of ' + str(d1))
            flag = 1
            break
        else:
            print(str(d) + ' is not a subset of ' + str(d1))
    if flag == 1:
        # if the set is a subset of another set, remove it
        data1 = [d1 for d1 in data1 if d1 != d]
    print('set: ',data1) # data1 will contain your result at the end of the loop


有输入:

0, 2, 3
0, 2, 3, 4
0, 3
1, 2, 4
2, 3
2, 3, 4


输出将是

[{1, 2, 4}, {0, 2, 3, 4}]


可以写入文件

关于python - 根据交点在列表中查找最佳超集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60396926/

10-15 06:00