簡體   English   中英

比較列表和列表字典的最快方法

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

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