總是在程式設計題目上碰到取列表中若干元素組合結果的情況,想出過解法但是老是忘,趁現在還記得趕緊寫下來
大致思路是:透過迭代遍歷每個元素位置,選擇可能的位置,用yield生成並返回。
def get_c(list1, num_left=None, list2=None): """ :param list1: 待取組合數列表 :param num_left: 待取元素數量 :param list2: (儲存已取元素列表) """ list2 = list2 or [] num_left = num_left or len(list1) for index in range(len(list1)-num_left+1): cur_list = list2+[list1[index]] if num_left > 1: list_left = list1[index+1:] yield from get_c(list_left, num_left-1, cur_list) else: yield cur_list if __name__ == '__main__': # 測試:從5個元素的列表[1~5]中獲取所有的3元素組合,共5x2=10個結果 test_data = [1, 2, 3, 4, 5] count = 0 for i in get_c(test_data, 3): print(i) count += 1 print(f'總共{count}個結果')