Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Python

Đơn giản hóa đường dẫn trong Python


Giả sử chúng ta có một đường dẫn tuyệt đối cho một tệp (như hệ thống tệp Unix), chúng ta cần đơn giản hóa nó. Nói cách khác, chúng ta phải chuyển đổi nó thành đường dẫn chuẩn (canonical path). Trong hệ thống tệp kiểu UNIX, dấu chấm đơn '.' chỉ thư mục hiện tại. Dấu chấm kép '..' di chuyển lên một cấp thư mục (thư mục cha). Các đặc điểm của đường dẫn chuẩn như sau:

  • Đường dẫn phải luôn bắt đầu bằng dấu gạch chéo /
  • Chỉ được có một dấu gạch chéo / duy nhất giữa hai tên thư mục.
  • Tên thư mục cuối cùng (nếu có) không được kết thúc bằng dấu gạch chéo /.
  • Đường dẫn chuẩn phải là chuỗi ngắn nhất biểu diễn đường dẫn tuyệt đối.

Ví dụ, nếu các đường dẫn cho trước là "/home/", "/../" và "/home//user/", thì các đường dẫn chuyển đổi tương ứng là "/home", "/" và "/home/user".

Các bước thực hiện

  • Tạo danh sách st, đưa '/' vào đó.
  • a := danh sách các chuỗi sau khi tách đường dẫn cho trước theo dấu phân cách '/'.
  • Với mỗi phần tử i trong a:
    • Nếu i là dấu chấm kép ('..'):
      • Nếu độ dài của st > 1, xóa phần tử cuối khỏi st, ngược lại tiếp tục.
    • Ngược lại nếu i là dấu chấm đơn ('.'), tiếp tục.
    • Ngược lại nếu i không phải chuỗi rỗng, chèn ('/' nối với i) vào st.
  • Nếu st chỉ có một phần tử, trả về '/'.
  • Trả về chuỗi sau khi nối tất cả các phần tử trong st.

Ví dụ minh họa

class Solution:
    def simplifyPath(self, a):
        st = ['/']
        a = a.split("/")
        for i in a:
            if i == '..':
                if len(st) > 1:
                    st.pop()
                else:
                    continue
            elif i == '.':
                continue
            elif i != '':
                st.append("/" + str(i))
        if len(st) == 1:
            return "/"
        return "".join(st[1:])

ob1 = Solution()
print(ob1.simplifyPath("/home/"))
print(ob1.simplifyPath("/../"))
print(ob1.simplifyPath("/home//user/"))

Đầu vào

"/home/" "/../" "/home//user/"

Đầu ra

/home / /home/user