簡體   English   中英

比較對象列表和字典列表

[英]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列表,探測dictset名稱。 這通常是一個恆定時間的操作。 因此,對於與sort_list中不同鍵的數量成正比的空間價格(如果您使用一個集合;否則它與條目數成正比,因為您將存儲索引)您現在可以執行一定數量的檢查時間與person_list中的條目數n成正比(而不是與n * m成正比的時間量)。

暫無
暫無

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

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