2009-01-16 14 views

回答

5

您可以使用list comprehension

domains = [matching['domain'] for matching in matchings if matching['id'] == the_id] 

下面的格式標準格式:

resulting_list = [item_to_return for item in items if condition] 

,基本上封裝了所有的以下功能:

domains = [] 
for matching in matchings: 
    if matching['id'] == the_id: 
     domains.append(matching['domain']) 

所有這些功能用列表解析在單行中表示。

+0

完美,謝謝! – 2009-01-16 19:58:11

+0

完美可能,但效率高嗎?匹配的長度是多少?請看看S.Lott的回答。 – tzot 2009-01-16 22:47:28

0

事實上,列表中的字典並不重要 - 問題歸結爲在列表中找到某個屬性爲true的項目。爲此,@ Soviut答案的一些變化是:循環或列表理解,檢查每個項目直到找到匹配項。沒有固有的項目排序,所以你甚至不能依靠像bisect這樣有用的東西。

1

我能想到的最好的辦法是做一個明確的搜索。這是一個領域,我在Python感到失望的是,它不會給你一個強大的集分離積木像C++ STL算法

[d["domain"] for d in matchings if d["id"] == "someid3"] 
2

我會重組matchings

from collections import defaultdict 
matchings_ix= defaultdict(list) 
for m in matchings: 
    matchings_ix[m['id']].append(m) 

現在最有效的查找是

matchings_ix[ d ] 
0

我真的很喜歡在這種情況下使用filter。它接受一個函數和一個迭代器,並返回函數返回True的元素列表(在Python 3.x中它返回一個迭代器)。

>>> filter(lambda x: x['id'] == 'someid3', matchings) 
<<< [{'domain': 'somedomain3.com', 'id': 'someid3'}] 

您可以通過使用列表中理解得到所有域的列表:

>>> [x['domain'] for x in filter(lambda x: x['id'] == 'someid3', matchings)] 
<<< ['somedomain3.com']