[英]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.