[英]compare list of objects and list of dicts
我是 Python 的新手,我有兩個解決方案可以解決我的問題,但我想知道這是否是正確的方法還是有更智能的解決方案?
我有一個包含對象的列表和第二個包含字典的列表。 兩者都包含名稱。 我想比較兩個列表中是否包含名稱。
帶有對象的列表的 class
class Person():
def __init__(self, name):
self.name = name
為示例創建兩個列表
i = 0
while i < 100:
person_list.append(Person("test" + str(i)))
i += 1
search_list = list()
i = 300
while i > 0:
search_list.append({"name": "test" + str(i)})
i -= 1
選項 a 對我來說似乎效率很低,因為它在 search_list 的每次迭代中遍歷整個 person_list
for search in search_list:
if [p for p in person_list if p.name == search["name"]]:
print(search["name"] + " found")
else:
print(search["name"] + " not found")
我不想從 person_list 中刪除一些東西來縮短迭代時間,因為我稍后會重用它。
選項 b 創建一個新列表,其中僅包含在此列表中搜索之前的名稱
for search in search_list:
if search["name"] in names:
print(search["name"] + " found")
names.remove(search["name"])
else:
print(search["name"] + " not found")
您的兩種方法都必須每次都掃描整個列表對(這就是x in some_list
person_list
的循環中所做的)。
我要做的是首先遍歷名稱列表,為索引構建名稱dict
。
from collections import defaultdict
names_to_indices = defaultdict(list)
for index, search in enumerate(search_list):
names_to_indices[search["name"]].append(index)
如果你不關心索引,你可以使用一個set
來代替:
distinct_names = set(map(lambda search: search["name"], search_list))
這是對搜索列表的一次遍歷,需要非常量空間。
然后,您可以遍歷您的Person
列表,探測dict
或set
名稱。 這通常是一個恆定時間的操作。 因此,對於與sort_list
中不同鍵的數量成正比的空間價格(如果您使用一個集合;否則它與條目數成正比,因為您將存儲索引)您現在可以執行一定數量的檢查時間與person_list
中的條目數n
成正比(而不是與n * m
成正比的時間量)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.