Openpyxl+itertools照合入金金額

8968 ワード

プロジェクトの需要はeasyで、ある日、プロジェクトの同僚は私に多くのお金が来たと言ったが、これらのお金は会社の財務支出の時に合併して支出された.支出されたプロジェクトがどのプロジェクトなのか分からないほどだ.プロジェクトが多すぎて、人工的に組み合わせを行う作業量が大きすぎるので、プログラミングでこの問題を解決したいと思っています.
文書ディレクトリ
  • プロジェクト需要
  • 素材
  • 実装プロセス
  • openpyxlの使用
  • itertoolsの使用
  • 後続の思考
  • プロジェクト要件
  • プロジェクトの需要:表1には多くの金額リストがあり、表2にも多くの金額リスト
  • がある.
  • 表1の各金額は、表2の2つ以上の金額を組み合う
  • となる.
  • 対応関係
  • を解く
    素材
  • 両表
  • pythonプログラム
  • openpyxlモジュールおよびitertoolsモジュール
  • インプリメンテーションプロセス
    Openpyxlの使用
    Openpyxlはpythonのモジュールで、excelテーブルを操作するのに便利で、データ処理に使用できます.
    import itertools
    from openpyxl import load_workbook
    #  excel
    excel1 = load_workbook("    .xlsx")
    #  sheet     
    sheet = excel1.get_sheet_names()[1]
    sheet = excel1.active
    #         
    data1 = dict()
    for i in sheet['C']:
        if type(i.value) == type(3.14):
            data1['C' + str(i.row)] = i.value
    excel1.close()
    print(data1)
    excel2 = load_workbook("       .xlsx")
    sheet = excel2.get_sheet_names()[0]
    sheet = excel2.active
    data2 = dict()
    for i in sheet['P']:
        if type(i.value) == type(3.14):
            data2['P' + str(i.row)] = i.value
    excel2.close()
    print(data2)
    

    以上のコードにより、2つのexcelテーブルデータをメモリにインポートできました.データ量が少ないので、すべてメモリで計算しても問題ありません.データ量が大きい場合は、この方法を慎むと、高度な手段を取らなければなりません.
    itertoolsの使用
    私はその中のcombinations()だけを使って、異なる組み合わせを返します.
    L = [1, 2, 3, 4]
    for i in itertools.combinations(L, 2):
        print(i)
    

    出力結果は以下の通りです.
    (1, 2) (1, 3) (1, 4) (2, 3) (2, 4) (3, 4)
    わかりました.この問題はもう解けました.遍歴すれば終わりだ
    for x in range(2, len(data2)):
        L = itertools.combinations(data2, x)
        for numbers in data1:
            for i in L:
                key = 0
                for j in i:
                    key += j[1]
                    if abs(data1[numbers] - key) < 0.01:
                        print(numbers, data1[numbers], i, key, sep=' ')
    

    後続の思考
    私は菜鶏で、頭がないだけです.今日はitertoolsモジュールを使わなければ、私はどのように組み合わせ数を実現すればいいか考えています.その後、私は雛形を持っていましたが、実践に移しませんでした.m個の数の中からn個の数の組み合わせは、まず1つの数を確定してから、別のn-1個の数の組み合わせを確定することに相当し、この状況はm回繰り返します.2つの数の組み合わせを求めるまで押すと、まず1つの数を確定し、別の数を選ぶことになります.
    これは実は1つの典型的な再帰思想で、しかしどうして分からないで、私にそれを実現させて、私は何も考えられなくて、その上最近確かにまだ比較的に忙しいです.暇があったらitertoolsモジュールのcombinationsのソースコードを読んでください.私の個人的なアップグレードに役立つでしょう.