从di获取多个值的最佳方法

2024-04-29 15:10:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这样一个dict对象的列表:

[{'emailAddress': 'user1@example.com', 'country': 'US'},
{'emailAddress': 'user2@example.com', 'country': 'CA'},
{'emailAddress': 'user3@example.com', 'country': 'UK'}]

dict对象的列表只有20多万条记录。在

我想做的是找到国家的电子邮件地址列表。例如,如果我有这样一个列表:

^{pr2}$

我想还这个:

['US', 'UK']

现在,我可以通过定义如下函数来实现:

def getBaseOUs(emailAddresses):
    countries = []
    for emailAddress in emailAddresses:
        for user in usermap:
            if emailAddresses == user['emailAddress']:
                countries.append(user['country'])
    return countries

但是我想知道人们认为最快/最节省cpu的方法是什么?在

谢谢。在


Tags: 对象incom列表forexamplecountrycountries
3条回答

试试这个:

import pandas as pd
df = pd.DataFrame(addresses)
df = df.set_index('emailAddress')
result = df.loc[somelist]['country']
for i in result:
    print(i)
# US
# UK

数据帧也应该比你的dicts列表占用更少的空间,并且通过将email作为索引,每次查找它都是O(1)。在

编辑:深空提出了一个很好的观点。要减少占用空间,可以删除原始dict:

^{pr2}$

不过,如果可以的话,从一开始就使用更紧凑的Pandas dataframe,而不创建dict

与其检查每个用户的每个电子邮件地址,不如按电子邮件地址查找用户:

def get_email_lookup(users):
    return {user['emailAddress']: user for user in users}

然后利用它:

^{pr2}$

如果你想查询尽可能多的电子邮件地址,这可能是你的最佳选择

database = [{'emailAddress': 'user1@example.com', 'country': 'US'},
{'emailAddress': 'user2@example.com', 'country': 'CA'},
{'emailAddress': 'user3@example.com', 'country': 'UK'}]

emails = ['user1@example.com', 'user3@example.com']
emailset = set(emails)

countries = [record['country'] for record in database if record['emailAddress'] in emailset]

另一方面,如果只查询一小部分用户:

^{pr2}$

当然,最好的整体解决方案是创建一个字典,将电子邮件映射到您当前拥有的词典:

def transform(database):
    answer = {}
    for record in database:
        answer[record]['emailAddress'] = record
    return answer

现在,您可以这样查询它:

def query(database, emails):
    database = transform(database)
    answer = [database[email] for email in emails]
    return answer

相关问题 更多 >