我想撰寫一個 python 程式,我想在其中獲取n許多命令列引數。
例如: python3 myProgram.py 3 A B C
在上面的例子中n = 3,3 個引數是A, B, C
現在第一我想生成這些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)))
但我無法理解如何合并這兩件事并得到我想要的結果。請幫幫我。
uj5u.com熱心網友回復:
我認為這可能是兩個不同的問題。第一個是如何獲得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()
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/360984.html
下一篇:逐行寫入文本檔案c
