对具有两个不断变化的 ID 的唯一用户进行分组

问题描述

你能想出一个更快的算法来解决这个问题吗?或者改进代码?

问题:

我有两个客户 ID:

  • ID1(例如电话号码)
  • ID2(例如电子邮件地址)

用户有时会更改其 ID1,有时会更改 ID2。怎么能 我找到了唯一身份用户?

示例:

ID1 = [7,7,8,9]

ID2 = [a,b,c]

预期结果:

ID3 = [Anna,Anna,Paul]

enter image description here

现实世界的场景大约有。每个列表 600 000 个项目。

这里已经有了一个 SQL 的想法:How can I match Employee IDs from 2 columns and group them into an array?

我从一个对 TypeScript 有这个想法的朋友那里得到了帮助:https://stackblitz.com/edit/typescript-leet-rewkmh?file=index.ts

我的第二个朋友帮我写了一些伪代码,我能够创建这个:

迄今为止最快(不再工作)的代码:

ID1 = [7,9]
ID2 = ["a","b","c"]

def timeit_function(ID1,ID2):
    
    def find_user_addresses():
        phone_i = []
        email_i = []
        
        tmp1 = [ID1[0]]
        tmp2 = []
        tmp_index = []

        while len(tmp1) != 0 or len(tmp2) != 0:
            while len(tmp1) != 0:
                tmp_index = []  
                for index,value in enumerate(ID1):
                    if value == tmp1[0]:
                        tmp2.append(ID2[index])
                        tmp_index.insert(-1,index)

                for i in tmp_index: 
                    del ID1[i]
                    del ID2[i]
                tmp1 = list(dict.fromkeys(tmp1))
                phone_i.append(tmp1.pop(0))

            while len(tmp2) != 0:
                tmp_index = [] 
                for index,value in enumerate(ID2):
                    if value == tmp2[0]:
                        tmp1.append(ID1[index])
                        tmp_index.insert(0,index)

                for i in tmp_index: 
                    del ID1[i]
                    del ID2[i]
                tmp2 = list(dict.fromkeys(tmp2))
                email_i.append(tmp2.pop(0))

        return phone_i,email_i
    
    users = {}
    i = 0
    while len(ID1) != 0:
        phone_i,email_i = find_user_addresses()
        users[i] = [phone_i,email_i]
        i += 1
    return users

输出:

{0: [[7,8],['a','b']],1: [[9],['c']]}

含义:{User_0: [[phone1,phone2],[email1,email2]],User_1: [phone3,email3]}

排名

排名 用户名 %timeit 唯一身份用户 正确的输出?
1. 扎卡里·万斯 每个循环 32 ms ± 1.9 ms(平均值 ± 标准偏差,7 次运行,每次 10 次循环) 1408 是的
2. 伊格里尼斯 每个循环 5.54 秒 ± 81.7 毫秒(平均值 ± 标准偏差。7 次运行,每个循环 1 个) 1408 是的
(3.) dkapitan 每个循环 8 秒 ± 106 毫秒(平均值 ± 标准偏差。7 次运行,每个循环 1 个) 3606 没有
(4.) thenarfer 每个循环 2.34 µs ± 3.25 µs(平均值 ± 标准偏差,7 次运行,每个循环 1 个) 1494 没有

代码使用两个列表 here 运行(加载需要一些时间)。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)