[英]Fastest way to compare a list to a dict of lists
所以我有兩個清單:
list1 = ['abc', 'efg', 'hijk'] #list of strings
list2 = ['lmno', 'pqrs'] #also a list of strings
然后我有一個通常很大的字典,只有約100個鍵和數十萬個字符串值填充列表
d = {'abc': ['lmno'], 'efg': ['lmno', 'pqrs']}
所以我需要遍歷list1的每個項目和list2的每個項目:
例:
for i1 in list1:
for i2 in list2:
print(i1, i2)
然后將數據與字典進行比較:
for i1 in list1:
for i2 in list2:
if i1.lower() in d:
if i2 in d[i1.lower()]:
continue #ignore
else:
#process data
目前,我的代碼與上面類似,但是當dict很大時,它會非常慢,是否有更快的方法呢?
for i1 in list1:
for i2 in list2:
if i1.lower() in d:
if i2 in d[i1.lower()]:
continue #ignore
else:
#process data
交換第二行和第三行,如果i1.lower()
不在d
則不會遍歷list2
。
for i1 in list1:
if i1.lower() in d:
for i2 in list2:
if i2 in d[i1.lower()]:
continue #ignore
else:
#process data
另外,如@ aran-fey所述,首先將d
轉換為set的字典:
d = {k: set(v) for k, v in d.items()}
更進一步(感謝@AlexHall):
d = {k: set(v) for k, v in d.items()}
set2 = {i2.lower() for i2 in list2}
for i1 in list1:
for i2 in set2 - d.get(i1.lower(), set()):
#process data
我猜您有兩個列表,一個包含鍵,另一個包含值。 您需要在遍歷值之前檢查字典中的鍵,這將使此操作更有效。
for i1 in list1:
if i1.lower() in d:
for i2 in list2:
if i2 in d[i1.lower()]:
continue #ignore
else:
#process data
也許不是最快的,您必須檢查一下。 但是,它更整潔。
from operator import itemgetter
keys_to_check = [
'abc', 'efg', 'hijk'
]
strings_to_check = [
'lmno', 'pqrs'
]
d = {
'abc': ['lmno'],
'efg': ['lmno', 'pqrs']
}
# Makes function that will get values for specified keys
# . Checks if the key is within dictionary
values = itemgetter(*(key.lower() for key in keys_to_check if key.lower() in d))
for value in values(d):
# Checks if any fo strings within value is in the strings_to_check
# . if so, ignore that value
if any(strng in strings_to_check for strng in value):
continue
else:
# process data
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.