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

Tìm các địa chỉ liên hệ giống nhau trong danh sách các địa chỉ liên hệ bằng Python


Giả sử chúng ta có một danh sách các liên hệ chứa tên người dùng, email và số điện thoại theo thứ tự bất kỳ, chúng tôi phải tìm các liên hệ giống nhau (Khi cùng một người có nhiều liên hệ khác nhau) và trả về các liên hệ giống nhau cùng với nhau. Chúng tôi phải ghi nhớ rằng -

  • Một liên hệ có thể lưu trữ tên người dùng, email và các trường điện thoại theo bất kỳ đơn đặt hàng nào.

  • Hai địa chỉ liên hệ giống nhau nếu chúng có cùng tên người dùng hoặc cùng email hoặc cùng số điện thoại.

Vì vậy, nếu đầu vào giống như Danh bạ =[{"Amal", "amal@gmail.com", "+915264"}, {"Bimal", "bimal321@yahoo.com", " +1234567 "}, {" Amal123 "," +1234567 "," amal_new@gmail.com "}, {" AmalA Another "," +962547 "," amal_new@gmail.com "}], thì đầu ra sẽ là [ 0,2,3], [1] giống như các địa chỉ liên hệ tại chỉ mục [0,2,3] và một địa chỉ liên hệ khác tại chỉ mục 1.

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

  • Định nghĩa một hàm create_graph (). Điều này sẽ nhận cnt, n, ma trận

  • đối với tôi trong phạm vi từ 0 đến n, hãy thực hiện

    • đối với j trong phạm vi từ 0 đến n, thực hiện

      • ma trận [i, j]:=0

  • đối với tôi trong phạm vi từ 0 đến n, hãy thực hiện

    • đối với j trong phạm vi i + 1 đến n, thực hiện

      • nếu cnt [i] .slot1 giống với cnt [j] .slot1 hoặc cnt [i] .slot1 giống với cnt [j] .slot2 orcnt [i] .slot1 giống với cnt [j] .slot3 hoặc cnt [ i] .slot2 giống với cnt [j] .slot1 orcnt [i] .slot2 giống với cnt [j] .slot2 hoặc cnt [i] .slot2 giống với cnt [j] .slot3 orcnt [i] .slot3 giống với cnt [j] .slot1 hoặc cnt [i] .slot3 giống với cnt [j] .slot2 orcnt [i] .slot3 giống với cnt [j] .slot3, sau đó

        • ma trận [i, j]:=1

        • ma trận [j, i]:=1

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

  • Xác định một hàm visit_using_dfs (). Điều này sẽ lấy i, ma trận, đã thăm, sol, n

  • đã ghé thăm [i]:=True

  • chèn tôi vào cuối sol

  • đối với j trong phạm vi từ 0 đến n, thực hiện

    • nếu ma trận [i] [j] khác 0 và không được thăm [j] khác 0 thì

      • visit_using_dfs (j, ma trận, đã thăm, sol, n)

  • Từ phương thức chính, thực hiện như sau -

  • n:=kích thước của cnt

  • sol:=một danh sách mới

  • matrix:=tạo ma trận vuông kích thước n x n

  • đã thăm:=tạo một mảng có kích thước n và điền bằng 0

  • create_graph (cnt, n, matrix)

  • đối với tôi trong phạm vi từ 0 đến n, hãy thực hiện

    • nếu không được truy cập [i] là khác 0, thì

      • visit_using_dfs (i, ma trận, đã thăm, sol, n)

      • chèn -1 vào cuối sol

  • đối với tôi trong phạm vi từ 0 đến kích thước của sol, do

    • nếu sol [i] giống -1 thì

      • chuyển đến dòng tiếp theo

    • nếu không,

      • hiển thị sol [i]

Ví dụ

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

class contact:
   def __init__(self, slot1, slot2, slot3):
      self.slot1 = slot1
      self.slot2 = slot2
      self.slot3 = slot3
def generate_graph(cnt, n, matrix):
   for i in range(n):
      for j in range(n):
         matrix[i][j] = 0
   for i in range(n):
      for j in range(i + 1, n):
         if (cnt[i].slot1 == cnt[j].slot1 or cnt[i].slot1 == cnt[j].slot2 or cnt[i].slot1 == cnt[j].slot3 or cnt[i].slot2 == cnt[j].slot1 or cnt[i].slot2 == cnt[j].slot2 or cnt[i].slot2 == cnt[j].slot3 or cnt[i].slot3 == cnt[j].slot1 or cnt[i].slot3 == cnt[j].slot2 or cnt[i].slot3 == cnt[j].slot3):
            matrix[i][j] = 1
            matrix[j][i] = 1
            break
def visit_using_dfs(i, matrix, visited, sol, n):
   visited[i] = True
   sol.append(i)
   for j in range(n):
      if (matrix[i][j] and not visited[j]):
         visit_using_dfs(j, matrix, visited, sol, n)
def get_similar_contacts(cnt):
   n = len(cnt)
   sol = []
   matrix = [[None] * n for i in range(n)]
   visited = [0] * n
   generate_graph(cnt, n, matrix)
   for i in range(n):
      if (not visited[i]):
         visit_using_dfs(i, matrix, visited, sol, n)
         sol.append(-1)
   for i in range(len(sol)):
      if (sol[i] == -1):
         print()
      else:
         print(sol[i], end = " ")

cnt = [contact("Amal", "amal@gmail.com", "+915264"),
   contact("Bimal", "bimal321@yahoo.com", "+1234567"),
   contact("Amal123", "+915264", "amal_new@gmail.com"),
   contact("AmalAnother", "+962547", "amal_new@gmail.com")]
get_similar_contacts(cnt)

Đầu vào

cnt = [contact("Amal", "amal@gmail.com", "+915264"),
contact("Bimal", "bimal321@yahoo.com", "+1234567"),
contact("Amal123", "+915264", "amal_new@gmail.com"),
contact("AmalAnother", "+962547", "amal_new@gmail.com")]

Đầu ra

0 2 3
1