Python 如何在字典列表中查找值并返回特定键

Python 如何在字典列表中查找值并返回特定键,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,我有一个gpg密钥列表。每个人都有自己的字典。我想按一个值搜索字典列表foo@foo.bar'并返回同一字典中键d['keyid']的值。这是我所拥有的 >>> import gnupg >>> gpg = gnupg.GPG() >>> email = 'foo@foo.bar' >>> keyIn = gpg.gen_key_input(name_real = 'works' , name_email = >&g

我有一个gpg密钥列表。每个人都有自己的字典。我想按一个值搜索字典列表foo@foo.bar'并返回同一字典中键d['keyid']的值。这是我所拥有的

>>> import gnupg
>>> gpg = gnupg.GPG()
>>> email = 'foo@foo.bar'
>>> 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 <foo@foo.bar>']}, {'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 <foo@foo.bar>']}, {'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 <foo@foo.bar>']}]

所有函数要么返回
None
,要么返回错误。我怎样才能让它工作呢。为什么我到目前为止失败了。我哪里出错了?

您可以使用列表理解和
任何
函数,如下所示

key = 'foo@foo.bar'
print [d["keyid"] for d in klist if any(key in uid for uid in d["uids"])]
输出

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

您可以使用列表理解和
任何
函数,如下所示

key = 'foo@foo.bar'
print [d["keyid"] for d in klist if any(key in uid for uid in d["uids"])]
输出

[u'CF7BBCC34CCC28A0', u'865F4A95D4999F17', u'1F6A4AEA477EFBD6']
试试这个,可能有用:

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

CF7BBCC34CCC28A0
865F4A95D4999F17
1F6A4AEA477EFBD6
试试这个,可能有用:

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

CF7BBCC34CCC28A0
865F4A95D4999F17
1F6A4AEA477EFBD6

真是太棒了!非常感谢。所以我应该为我搜索的值指定“键”?@Matt You's welcome:)是的。在
变量中指定要查找的地址。请不要忘记接受这个答案,如果它对你有帮助的话:)那太好了!非常感谢。所以我应该为我搜索的值指定“键”?@Matt You's welcome:)是的。在
变量中指定要查找的地址。请不要忘记接受这个答案,如果它对你有帮助的话:)同样有效!按照你写的内容,我没有把它嵌套得足够远?你的第三次尝试非常接近我的方法,你只需要用
d['uids]
来更改
d[k]
并记住,当您使用return时,函数将返回它找到的值,并且不会继续循环的其余部分。@Matt欢迎使用堆栈溢出!这是有益的投票有益的答案,并接受一个适合你的需要:)@Christian谢谢你的额外提示。我不知道:)@vinod谢谢你。如果可以,我会投票。首先需要更多的代表。:)同样有效!按照你写的,我没有把它嵌套得足够远?你的第三次尝试与我的方法非常接近,你只需要用
d['uids']
更改
d[k]
,记住,当你使用return时,函数只会返回它找到的值,而不会继续循环的其余部分。@Matt欢迎使用堆栈溢出!这是有益的投票有益的答案,并接受一个适合你的需要:)@Christian谢谢你的额外提示。我不知道:)@vinod谢谢你。如果可以,我会投票。首先需要更多代表。:)