2013-12-19 95 views
1

我有一個PHP背景,是相當新的python,我創建了一個輔助類,用於返回一個ldap服務器的結果。Python最好的方式來創建新的字典循環遍歷包含列表的字典列表

從蟒蛇LDAP庫標準的結果:ldap.search_s()裏面裏面,即列表元組的使用詞典列表:

[('uid', {'cn': ['cnvalue']}), ('uid2', {'cn': ['cnvalue2']})] 

我想這個轉換成字典或一個簡單的列表在PHP中講一組關聯數組。

對於我的生活,我無法弄清楚如何做到這一點。

這是多麼我已經嘗試過:

output = []   
for i, result in enumerate(results):    
    d = { 
     'firstname': result[1].['givenName'][1], 
     'phone': result[1].['telephoneNumber'][1] 
    } 
    output.append(d) 
return output 

如果telephoneNumber不存在LDAP中的條目Python庫不填充該鍵,所以有些時候我也陷入了無效鍵例外,因此我修改如下。

output = []   
for i, result in enumerate(results):    
    d = { 
     'firstname': result[1].get('givenName', '')[1], 
     'phone': result[1].get('telephoneNumber' ,'')[1] 
    } 
    output.append(d) 
return output 

即便如此,如果telephoneNumber不存在,那麼同樣沒有列表條目[1],所以現在我遇到了「超出範圍」的錯誤。

幫助。

謝謝大家。

+0

請注意,列表從'0'開始,而不是從'1'開始 – alko

+0

givenName核心如何響應'cn'和'cnvalue'? – alko

+1

這將是一個好主意,以您將使用的格式發佈一些名稱和電話號碼的數據。目前還不清楚你的內含字典的元組列表是如何與你的問題相關的。 – mrKelley

回答

4
result[1].get('givenName', '') 

這將返回一個列表(如果'givenName'是它的值是一個列表的字典中的鍵)或空字符串(如果'givenName'不是一個鍵)。

然後,您將應用[1]結果。假設你的意思是[0],但即使如此,一個空字符串的長度爲0.你不能在其中查找索引0或索引1。

你可以做,而不是:

result[1].get('givenName', [''])[0] 

現在在密鑰丟失,你的情況有一個包含一個空字符串列表。因此,將[0]應用於它會爲您提供一個空字符串。

一種選擇(不對付列表爲空,但我不知道是否曾經發生在你處理數據):

def getfirst(attrs, key): 
    list_or_none = attrs.get(key) 
    return '' if list_or_none is None else list_or_none[0] 

然後:

d = { 
    'firstname': getfirst(result[1], 'givenName'), 
} 

順便說一句,你使用enumerate,但從未實際提到i。所以你可以寫for result in results:

+1

@alko:這是一本字典。在這個例子中它的佔位符是'{'cn':['cnvalue']}',但提問者正在查找'givenName'和'telephoneNumber'而不是'cn'。所以我認爲'cn'既可以作爲實際密鑰的一個例子,也可以是一個佔位符,這些密鑰可能存在或不存在於給定的LDAP記錄中。 –

+0

http://www.python-ldap.org/doc/html/ldap.html說,「每個結果元組的形式是(dn,attrs),其中dn是一個字符串,其中包含DN(專有名稱)條目,attrs是包含與條目相關的屬性的字典,attrs的鍵是字符串,相關的值是字符串列表。 –

+0

ZOMG!史蒂夫說,這是一個快速的答覆,正是我所期待的。 謝謝! – Rel