簡體   English   中英

從dict獲取多個值的最佳方法

[英]Best way to get multiple values from dict

我有一個像這樣的字典對象列表:

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

dict對象列表的長度剛剛超過20萬條記錄。

我想做的就是找到該國家的電子郵件地址列表。 例如,如果我有一個這樣的列表:

['user1@example.com', 'user3@example.com']

我希望它返回:

['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方式是什么嗎?

謝謝。

如果您想查詢與用戶數量差不多的電子郵件地址,這可能是最好的選擇

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]

另一方面,如果您只想查詢一小部分用戶:

def query(database, emails):
    answer = []
    emailset = set(emails)
    for record in database:
        if not emailset: break
        email = record['emailAddress']
        if email not in emailSet: continue
        emailSet.pop(email)
        answer.append(record['country'])

    return answer

當然,最好的整體解決方案是創建一個字典,將電子郵件映射到您當前擁有的字典:

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

與其遍歷每個電子郵件地址的每個用戶,不如通過電子郵件地址查找用戶:

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

然后利用它:

def getBaseOUs(emailAddresses):
    by_email = get_email_lookup(usermap)
    return [by_email[email]['country'] for email in emailAddresses]

嘗試這個:

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

數據框還應該比字典列表占用更少的空間,並且通過使電子郵件成為索引,每次查找的空間為O(1)。

編輯:DeepSpace提出了一個很好的觀點。 為了減少占用空間,您可以刪除原始字典:

del addresses

盡管可以幫助,但從一開始就使用更緊湊的Pandas數據框,而無需創建dict。

@deepspace指出我不需要字典列表。 一個命令即可:

{'user1@example.com': 'US', 'user2@example.com': 'CA'}

然后,我可以簡單地通過密鑰獲得國家/地區。 大約50萬個項目執行起來非常快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM