首页 > 解决方案 > 通过联系电话或电子邮件地址识别重复的客户元组

问题描述

我正在尝试使用 python 根据以下条件对客户的索引进行分组。

如果数据库包含相同的联系电话或电子邮件,则结果应返回在子列表中分组在一起的元组的索引。

对于给定的数据库:

data = [
 ("Customer1","contactA", "emailA"),
 ("CustomerX","contactA", "emailX"),
 ("CustomerZ","contactZ", "emailW"),
 ("CustomerY","contactY", "emailX"),
 ]

上例显示 Customer1 和 CustomerX 共享相同的联系电话,CustomerX 和 CustomerY 共享相同的电子邮件,因此 Customer1、CustomerX 和 CustomerY 是同一个客户。

因此结果是[[0, 1, 3], [2]]

标签: python

解决方案


您可以构建一个图表,将元素与普通电子邮件或普通联系人连接起来,然后找到连接的组件(例如,通过使用bfs访问)。
在这种情况下,我使用networkx库来构建图形并查找连接的组件。

>>> contacts = defaultdict(list)
>>> emails = defaultdict(list)
>>> for idx, (name, contact, email) in enumerate(data):
...     contacts[contact].append(idx)
...     emails[email].append(idx)
...
>>> g = nx.Graph()
>>> for common_attr in itertools.chain(contacts.values(), emails.values()):
...     g.add_edges_from(itertools.combinations(common_attr,2))
... 
>>> list(nx.connected_components(g))
[{0, 1, 3}, {2}]

推荐阅读