在 Python 中从命令行生成的组合后获取文件的并集

Getting union of files after the combination generated from command line in Python

我想编写一个 python 程序,我想在其中使用 n 个命令行参数。

举个例子:python3 myProgram.py 3 A B C

在上面的例子中 n = 3 和 3 个参数是 A, B, C

现在 1st 我想生成这些 n 参数的所有组合,空参数除外。对于上面的例子,它将是:A, B, C, AB, AC, BC, ABC

所以我要得到2^n-1个组合。

对于上面的部分,我正在尝试:

import sys
import itertools 
from itertools import combinations

number = int(sys.argv[1]);

a_list=list(sys.argv[2:number+2])

all_combinations = []
for r in range(len(a_list) + 1):
    combinations_object = itertools.combinations(a_list, r)
    combinations_list = list(combinations_object)
    all_combinations += combinations_list

print(all_combinations)

但是这里我无法删除空组合。

现在我最初在同一个目录中有 n 个文件。对于上述情况的示例,我有 3 个文件:A.txt, B.txt, C.txt

现在,我想为每个组合生成一个输出文件,如:

只有A时outputfile_1 = A.txt

只有B时outputfile_2 = B.txt

只有C时outputfile_3 = C.txt

当它是 AB 时 outputfile_4 = union (A.txt, B.txt)

...

等等

当它是 ABC 时 outputfile_7 = union (A.txt, B.txt, C.txt)

因此对于上面的示例,如果我 运行 代码如下: python3 myProgram.py 3 A B C 那么我将获得 7 个输出文件作为输出。

如果是 python3 myProgram.py 4 A B C D 那么我将得到 15 个输出文件作为输出。

要使用 Union 的概念,我尝试使用逻辑:

with open("A.txt") as fin1: lines = set(fin1.readlines())
with open("B.txt") as fin2: lines.update(set(fin2.readlines()))
with open("outputfile_4.txt", 'w') as fout: fout.write('\n'.join(list(lines)))

但我无法理解如何合并这两件事并获得我想要的结果。请帮帮我。

我认为这可能是两个不同的问题。第一个是如何获得 n 大于 0 的所有组合。@timus 在正确的轨道上。为了让他们的回答更完整:

  1. 使用列表理解生成 itertools.combinations 个对象的列表
  2. 使用嵌套列表理解来制作元组的一维列表
matrix = [itertools.combinations(a_list, r) for r in range(1, len(a_list) + 1)]
combinations = [c for combinations in matrix for c in combinations]

第二个问题好像不太清楚。我不确定它是如何迭代组合,如何从组合中获取文件名,还是其他。我在下面提供了一个示例实现 (python3.6+).

import sys
import itertools 

def union(files):
    lines = set()
    for file in files:
        with open(file) as fin:
            lines.update(fin.readlines())
    return lines

def main():
    number = int(sys.argv[1]);
    a_list=sys.argv[2:number+2]
    
    matrix = [itertools.combinations(a_list, r) for r in range(1, len(a_list) + 1)]
    combinations = [c for combinations in matrix for c in combinations]
    for combination in combinations:
        filenames = [f'{name}.txt' for name in combination]
        output = f'{"".join(combination)}_output.txt'
        print(f'Writing union of {filenames} to {output}')
        with open(output, 'w') as fout:
            fout.writelines(union(filenames))

if __name__ == '__main__':
    main()