Computer >> Máy Tính >  >> Lập trình >> Python

Chương trình thực hiện thao tác trên bảng tính excel bằng Python?

Giả sử chúng ta có một ma trận 2D biểu diễn một bảng tính excel. Chúng ta phải tìm cùng một ma trận với tất cả các ô và công thức được tính toán. Một bảng tính excel trông giống như bên dưới

B1 7 0
3 5 =A1 + A2

Các cột được đặt tên là (A, B, C ...) và các hàng là (1, 2, 3 ...) Mỗi ​​ô sẽ chứa một giá trị, một tham chiếu đến một ô khác hoặc một công thức excel cho một phép toán với giữa tham chiếu ô số hoặc ô. (Ví dụ. "=A1 + 5", "=A2 + B2" hoặc "=2 + 5")

Vì vậy, nếu đầu vào giống như

B1 7 0
3 5 =A1 + A2

thì đầu ra sẽ là

7 7 0
3 5 10

như B1 =7 (Cột thứ hai hàng đầu tiên) và "=A1 + A2" là 7 + 3 =10.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau

  • Xác định một hàm giải quyết (). Điều này sẽ mất s

  • nếu s là số, thì trả về s dưới dạng số nguyên

  • nếu không thì trả về giải quyết (getIdx (s))

  • Định nghĩa một hàm getIdx (). Điều này sẽ mất s

  • trả về một danh sách trong đó giá trị đầu tiên là chuỗi con của s từ 1 đến cuối là số nguyên và giá trị thứ hai là ASCII của s [0] - ASCII của "A"

  • Định nghĩa một hàm do (). Điều này sẽ mất a, b, op

  • nếu op giống như "+" thì

    • trả về a + b

  • nếu op giống như "-" thì

    • trả về a - b

  • nếu op giống như "*" thì

    • trả về a * b

  • nếu op giống như "/" thì

    • trả về a / b

  • Định nghĩa một hàm giải quyết (). Điều này sẽ mất tôi, j

  • nếu ma trận [i, j] là số thì trả về giá trị đó

  • ngược lại:

    • s:=matrix [i, j]

    • nếu s [0] giống với "=" thì

      • đối với mỗi c trong chuỗi con của s [từ chỉ mục 2 đến cuối], thực hiện

        • nếu c là bất kỳ toán tử nào trong (+, -, /, *) thì

          • op:=c

          • đi ra từ vòng lặp

      • [a, b]:=chuỗi con của s [từ chỉ mục 1 đến cuối] và chia nó bằng op

      • [aRes, bRes]:=[giải quyết (a), giải quyết (b)]

      • return do (aRes, bRes, op)

    • nếu không,

      • trả về giải quyết (getIdx (s))

  • đối với tôi trong phạm vi 0 đến số hàng của ma trận, hãy thực hiện

    • đối với j trong phạm vi 0 đến số cột của ma trận, thực hiện

      • ma trận [i, j]:=(giải quyết (i, j)) dưới dạng chuỗi

  • ma trận trả về

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn:

Ví dụ

class Solution:
   def solve(self, matrix):
      def resolve(s):
         try:
            return int(s)
         except:
            return solve(*getIdx(s))

      def getIdx(s):
         return [int(s[1:]) - 1, ord(s[0]) - ord("A")]

      def do(a, b, op):
         if op == "+":
            return a + b
         if op == "-":
            return a - b
         if op == "*":
            return a * b
         if op == "/":
            return a / b

      def solve(i, j):
         try:
            return int(matrix[i][j])
         except:
            s = matrix[i][j]
            if s[0] == "=":
               for c in s[2:]:
                  if c in "+-/*":
                     op = c
                     break
               a, b = s[1:].split(op)
               aRes, bRes = resolve(a), resolve(b)
               return do(aRes, bRes, op)
            else:
               return solve(*getIdx(s))

      for i in range(len(matrix)):
         for j in range(len(matrix[0])):
            matrix[i][j] = str(solve(i, j))

      return matrix

ob = Solution()
matrix = [
   ["B1", "7", "0"],
   ["3", "5", "=A1+A2"]
]
print(ob.solve(matrix))

Đầu vào

[["B1", "7", "0"],
["3", "5", "=A1+A2"] ]

Đầu ra

[['7', '7', '0'],
['3', '5', '10']]