2014-01-05 23 views
1

我有一個gpg密鑰列表。每個都在自己的字典中。我想通過一個值'[email protected]'來搜索這個字典列表s,並在同一個字典中返回關鍵字d ['keyid']的值。下面是我有:如何在字典列表中查找值並返回特定密鑰

>>> import gnupg 
>>> gpg = gnupg.GPG() 
>>> email = '[email protected]' 
>>> keyIn = gpg.gen_key_input(name_real = 'works' , name_email = 
>>> email,key_type='RSA',key_length=1024) 
>>> key = gpg.gen_key(keyIn) 
>>> klist = gpg.list_keys() 
>>> print klist 
[{'dummy': u'', 'keyid': u'CF7BBCC34CCC28A0', 'expires': u'1420347600', 'subkeys': [], 'length': u'1024', 'ownertrust': u'u', 'algo': u'1', 'fingerprint': u'5D917845BF81E47403265380CF7BBCC34CCC28A0', 'date': u'1388889639', 'trust': u'u', 'type': u'pub', 'uids': [u'works <[email protected]>']}, {'dummy': u'', 'keyid': u'865F4A95D4999F17', 'expires': u'1420347600', 'subkeys': [], 'length': u'1024', 'ownertrust': u'u', 'algo': u'1', 'fingerprint': u'C081E6552B027E2DA4143852865F4A95D4999F17', 'date': u'1388890408', 'trust': u'u', 'type': u'pub', 'uids': [u'works <[email protected]>']}, {'dummy': u'', 'keyid': u'1F6A4AEA477EFBD6', 'expires': u'1420347600', 'subkeys': [], 'length': u'1024', 'ownertrust': u'u', 'algo': u'1', 'fingerprint': u'B306139A3D740CECA71D9F281F6A4AEA477EFBD6', 'date': u'1388890595', 'trust': u'u', 'type': u'pub', 'uids': [u'works <[email protected]>']}] 

現在,這裏是我試過的功能:

def idfind(klist): 
    global email 
    for k in klist: 
     if email in k.items(): 
      return k 

def idfind(l): 
    global email 
    for d in l: 
     if any(d[email]): 
      return d['keyid'] 

def idfind(l, val): 
    for d in l: 
     for v in d[k]: 
      if val in v: 
       return d['keyid'] 

def idfind(lst,val): 
    for d in lst: 
     if isinstance(d,dict): 
      for k,v in d.items(): 
       if val in k: 
        return d['keyid'] 

def idfind(lst,val): 
    for d in lst: 
     if isinstance(d,dict): 
      for k,v in d.items(): 
       if val == v: 
        return d['keyid'] 

的功能全部或者返回None或錯誤。我如何得到這個工作。爲什麼我失敗了。我哪裏錯了?

回答

3

您可以使用列表中理解和any功能,這樣

key = '[email protected]' 
print [d["keyid"] for d in klist if any(key in uid for uid in d["uids"])] 

輸出

[u'CF7BBCC34CCC28A0', u'865F4A95D4999F17', u'1F6A4AEA477EFBD6'] 
+0

這很好用!謝謝。所以我應該爲我正在尋找的價值指定'鑰匙'? – Matt

+0

@Matt歡迎您:)是的。在'key'變量中分配你正在尋找的地址。並請不要忘記接受這個答案,如果它可以幫助你:) http://meta.stackexchange.com/a/5235/235416 – thefourtheye

2

試試這個,可能工作:

def idfind(klist): 
    for d1 in a: 
     for e in d1['uids']: 
      if email in e: 
       print d1['keyid'] 

輸出:

CF7BBCC34CCC28A0 
865F4A95D4999F17 
1F6A4AEA477EFBD6 
+0

也工作!通過你寫的東西,我沒有嵌入足夠遠? – Matt

+0

你的第三個**嘗試非常接近我的方法,你只需要用'd ['uids']'改變'd [k]',並且記住,當你使用** return **時,函數將僅返回找到的值,並且不會繼續執行循環的其餘部分。 – Christian

+0

@Matt歡迎來到堆棧溢出!這是有益的upvote有用的答案,並接受適合您的需求:) – vinod

相關問題