Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

ลดความซับซ้อนของเส้นทางใน Python


สมมติว่าเรามีเส้นทางที่แน่นอนสำหรับไฟล์ (เช่นเดียวกับระบบไฟล์ Unix) เราต้องทำให้มันง่ายขึ้น หรืออีกนัยหนึ่ง เราต้องแปลงเป็นเส้นทางตามบัญญัติ ในระบบไฟล์สไตล์ UNIX จุด '.' หมายถึงไดเร็กทอรีปัจจุบัน และจุดสองจุด '..' จะย้ายไดเร็กทอรีขึ้นหนึ่งระดับ (ไดเร็กทอรีหลัก) คุณสมบัติของเส้นทางตามรูปแบบบัญญัติมีดังนี้

  • เส้นทางต้องเริ่มต้นด้วยเครื่องหมายทับ /
  • ต้องมีเครื่องหมายทับเดียว / ระหว่างชื่อไดเรกทอรีสองชื่อ
  • ชื่อไดเร็กทอรีสุดท้าย (ถ้ามี) ต้องไม่ลงท้ายด้วย /.
  • เส้นทาง Canonical ต้องเป็นสตริงที่สั้นที่สุดซึ่งแสดงถึงเส้นทางที่แน่นอน

ตัวอย่างเช่น หากเส้นทางที่กำหนดคือ “/home/”, “/../” และ “/home//user/” พาธที่แปลงแล้วจะเป็น “/home”, “/” และ “/home/ ผู้ใช้”

ให้เราดูขั้นตอน -

  • จดรายการ st แล้วใส่ '/' ลงไป
  • a :=รายการสตริงหลังจากแยกเส้นทางที่กำหนดด้วยตัวคั่น '/'
  • สำหรับแต่ละองค์ประกอบ i ใน a
    • ถ้าฉันเป็นประจำเดือนสองครั้ง
      • ถ้าความยาวของ st> 1 ให้ลบองค์ประกอบสุดท้ายออกจาก st ไม่เช่นนั้นให้ดำเนินการต่อ
    • ถ้าเป็นประจำเดือนก็ไปต่อ
    • ถ้าไม่ใช่สตริงว่าง ให้แทรก ('/' เชื่อม i) ลงใน st
  • ถ้า st มีเพียงหนึ่งองค์ประกอบ ให้ส่งคืน '/'
  • ส่งคืนหลังจากเชื่อมองค์ประกอบทั้งหมดที่มีอยู่ใน st

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

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/"))

อินพุต

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

ผลลัพธ์

/home
/
/home/user