在 Python 中查找联系人列表中的相同联系人


假设我们有一个联系人列表,其中包含以任意顺序存储的用户名、电子邮件和电话号码,我们需要找到相同的联系人(当同一个人有多个不同的联系方式时),并将相同的联系人放在一起返回。我们需要记住以下几点:-

  • 一个联系人可以根据任何顺序存储用户名、电子邮件和电话字段。

  • 如果两个联系人具有相同的用户名、电子邮件或电话号码,则它们是相同的。

因此,如果输入类似于 Contacts = [{"Amal", "[email protected]", "+915264"},{ "Bimal", "[email protected]", "+1234567"},{ "Amal123", "+1234567", "[email protected]"},{ "AmalAnother", "+962547", "[email protected]"}],则输出将为 [0,2,3], [1],因为索引 [0,2,3] 处的联系人是相同的,而索引 1 处的另一个联系人。

要解决此问题,我们将遵循以下步骤:-

  • 定义一个函数 generate_graph()。这将接收 cnt、n、matrix 作为参数。

  • 对于 i 的范围从 0 到 n,执行以下操作:

    • 对于 j 的范围从 0 到 n,执行以下操作:

      • matrix[i, j] := 0

  • 对于 i 的范围从 0 到 n,执行以下操作:

    • 对于 j 的范围从 i + 1 到 n,执行以下操作:

      • 如果 cnt[i].slot1 与 cnt[j].slot1 相同,或者 cnt[i].slot1 与 cnt[j].slot2 相同,或者 cnt[i].slot1 与 cnt[j].slot3 相同,或者 cnt[i].slot2 与 cnt[j].slot1 相同,或者 cnt[i].slot2 与 cnt[j].slot2 相同,或者 cnt[i].slot2 与 cnt[j].slot3 相同,或者 cnt[i].slot3 与 cnt[j].slot1 相同,或者 cnt[i].slot3 与 cnt[j].slot2 相同,或者 cnt[i].slot3 与 cnt[j].slot3 相同,则:

        • matrix[i, j] := 1

        • matrix[j, i] := 1

        • 退出循环

  • 定义一个函数 visit_using_dfs()。这将接收 i、matrix、visited、sol、n 作为参数。

  • visited[i] := True

  • 将 i 插入到 sol 的末尾。

  • 对于 j 的范围从 0 到 n,执行以下操作:

    • 如果 matrix[i][j] 不为零,并且 visited[j] 不为零,则:

      • visit_using_dfs(j, matrix, visited, sol, n)

  • 从主方法中执行以下操作:-

  • n := cnt 的大小

  • sol := 一个新的列表

  • matrix := 创建一个大小为 n x n 的方阵

  • visited := 创建一个大小为 n 的数组,并填充 0

  • generate_graph(cnt, n, matrix)

  • 对于 i 的范围从 0 到 n,执行以下操作:

    • 如果 visited[i] 不为零,则:

      • visit_using_dfs(i, matrix, visited, sol, n)

      • 将 -1 插入到 sol 的末尾。

  • 对于 i 的范围从 0 到 sol 的大小,执行以下操作:

    • 如果 sol[i] 与 -1 相同,则:

      • 转到下一行。

    • 否则:

      • 显示 sol[i]

示例

让我们看看以下实现以获得更好的理解:-

现场演示

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", "[email protected]", "+915264"),
   contact("Bimal", "[email protected]", "+1234567"),
   contact("Amal123", "+915264", "[email protected]"),
   contact("AmalAnother", "+962547", "[email protected]")]
get_similar_contacts(cnt)

输入

cnt = [contact("Amal", "[email protected]", "+915264"),
contact("Bimal", "[email protected]", "+1234567"),
contact("Amal123", "+915264", "[email protected]"),
contact("AmalAnother", "+962547", "[email protected]")]

输出

0 2 3
1

更新于: 2020年8月19日

182 次查看

开启您的 职业生涯

通过完成课程获得认证

开始
广告