我有一个包含以下内容的文件,
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/