python - 通过联系电话或电子邮件地址识别重复的客户元组
问题描述
我正在尝试使用 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]]
解决方案
您可以构建一个图表,将元素与普通电子邮件或普通联系人连接起来,然后找到连接的组件(例如,通过使用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}]
推荐阅读
- java - 如何在 FireBaseHandler 中实现 ProgressBar
- sql - 如何修复年份格式异常 ORA-01841?
- c++ - 如何转换可以复制到 asio 缓冲区并发出正确声音的 vsti 音频数据?
- python - 在 Python 中操作元组列表
- ios - 将 UIImage 放在 UILabels 文本之间
- r - 使用 R 从序列化的内容字符串创建 .tar.gz 文件
- node.js - 异步中的承诺
- android - View pager 和 tabLayout 之间的空间,它位于 colpasing 工具栏内
- wso2 - WSO2 APIM 未发布 API 的自定义序列/设置变量
- apache - 在 apache ubuntu16.0.4 上安装 ssl