在 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 在正确的轨道上。为了让他们的回答更完整:
- 使用列表理解生成 itertools.combinations 个对象的列表
- 使用嵌套列表理解来制作元组的一维列表
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()
我想编写一个 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 在正确的轨道上。为了让他们的回答更完整:
- 使用列表理解生成 itertools.combinations 个对象的列表
- 使用嵌套列表理解来制作元组的一维列表
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()