在 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