在 Python 中查找联系人列表中的相同联系人
假设我们有一个联系人列表,其中包含以任意顺序存储的用户名、电子邮件和电话号码,我们需要找到相同的联系人(当同一个人有多个不同的联系方式时),并将相同的联系人放在一起返回。我们需要记住以下几点:-
一个联系人可以根据任何顺序存储用户名、电子邮件和电话字段。
如果两个联系人具有相同的用户名、电子邮件或电话号码,则它们是相同的。
因此,如果输入类似于 Contacts = [{"Amal", "amal@gmail.com", "+915264"},{ "Bimal", "bimal321@yahoo.com", "+1234567"},{ "Amal123", "+1234567", "amal_new@gmail.com"},{ "AmalAnother", "+962547", "amal_new@gmail.com"}],则输出将为 [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", "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)输入
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")]输出
0 2 3 1
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP