2013-02-09 157 views

回答

32

我可能會寫:

>>> lod = [{1: "a"}, {2: "b"}] 
>>> any(1 in d for d in lod) 
True 
>>> any(3 in d for d in lod) 
False 

但如果有將是一個很多類型的字典在此列表中,你可能要重新考慮你的數據結構。

如果你想索引和/或其中第一個找到匹配的字典,一個方法是使用nextenumerate

>>> next(i for i,d in enumerate(lod) if 1 in d) 
0 
>>> next(d for i,d in enumerate(lod) if 1 in d) 
{1: 'a'} 
>>> next((i,d) for i,d in enumerate(lod) if 1 in d) 
(0, {1: 'a'}) 

這將提高StopIteration如果它不存在:

>>> next(i for i,d in enumerate(lod) if 3 in d) 
Traceback (most recent call last): 
    File "<ipython-input-107-1f0737b2eae0>", line 1, in <module> 
    next(i for i,d in enumerate(lod) if 3 in d) 
StopIteration 

如果你想避免這種情況,你可以捕捉異常或通過next默認值,如None

>>> next((i for i,d in enumerate(lod) if 3 in d), None) 
>>> 

如由@drewk的評論中指出,如果你想獲得多個指標在多個值的情況下返回,您可以使用列表理解:

>>> lod = [{1: "a"}, {2: "b"}, {2: "c"}] 
>>> [i for i,d in enumerate(lod) if 2 in d] 
[1, 2] 
+0

說它確實存在,如果有幾個我怎麼能得到它的索引/第一個的索引? @DSM – user2057574 2013-02-09 20:25:04

+0

像這樣:'[我爲我,我在枚舉(lod),如果2在d]''或'[(我,d)爲我,d在枚舉(lod)如果2在d]'如果你想整個字典... ' – dawg 2013-02-09 20:28:57

2

使用any功能與發電機:

>>> d = [{1: "a"}, {2: "b"}] 
>>> any(1 in x for x in d) 
True 

any函數返回True,如果在iterable的至少一種元素傳遞給它是True。但是你真的需要考慮,爲什麼你沒有把所有的key: value組合在一個單獨的dict

1
parsedData=[] 
dataRow={} 
if not any(d['url'] == dataRow['url'] for d in self.parsedData): 
     self.parsedData.append(dataRow) 
0

在單dictoray看到我們「在」關鍵字使用:

key in dic_instance 

要檢查字典的名單,通過詞典列表,然後使用「任意」功能重複,因此,如果關鍵在任何發現的字典,它不會進一步迭代列表。

dic_list = [{1: "a"}, {2: "b"}] 
any(2 in d for d in dic_list) 
True 
any(4 in d for d in dic_list) 
False