Python字典枚举循环到键/值

Python字典枚举循环到键/值,python,python-3.x,python-3.6,Python,Python 3.x,Python 3.6,我对编程还不熟悉,但仍在尝试确定这里的逻辑 我正在使用python gnupg模块。有一个函数“list_keys(),我认为它返回字典列表 >>> gpg.list_keys() [{'type': 'pub', 'trust': '-', 'length': '4096', 'algo': '1', 'keyid': '1234', 'date': '1234', 'expires': '', 'dummy': '', 'ownertrust': '-', 'sig': '

我对编程还不熟悉,但仍在尝试确定这里的逻辑

我正在使用python gnupg模块。有一个函数“list_keys(),我认为它返回字典列表

>>> gpg.list_keys()
[{'type': 'pub', 'trust': '-', 'length': '4096', 'algo': '1', 'keyid': '1234', 'date': '1234', 'expires': '', 'dummy': '', 'ownertrust': '-', 'sig': '', 'uids': ['john doe <john@doe.com>'], 'sigs': [], 'subkeys': [['1234', 'e', '1234']], 'fingerprint': 'abc1234'}]
现在我想接受数字输入,并将其转换为相关的键/uid:

choice = int(input("Choose key: "))
# How do I translate from enumerated number list to its key?

# What does this do?
if choice in gpg.list_keys():
    choice = all_keys[choice][key]
我是否需要让循环为每个枚举结果生成一个列表?我不确定应该问哪些问题,也不完全理解这里的逻辑

目标是输入一个数字,将该数字转换为用户id,并检查字典中是否存在该用户id


非常感谢您的指导。我应该问些什么问题?

既然您已经标记了Python 3.6,我不建议依赖调用之间相同的字典顺序。您可以将编号映射到GPG键,就像另一个字典一样,而且由于
dict
有一个 非常简单:

enumerated_keys = dict(enumerate(all_keys))  # {0: {'type': 'pub', ...}, 1: {'type': 'pub', ...}}
print('\n'.join('{}. {}'.format(c, k['uids']) for c, k in enumerated_keys.items()))  # matches your output format
choice = int(input("Choose key: "))
try:
    print(enumerated_keys[choice])
except KeyError:
    print("Invalid option!")

我认为这里的主要思想是首先创建映射“user choice->GPG key”,然后将其呈现给用户。在您的代码中,您不会将
枚举的结果保存到任何地方,这显然会使以后使用它变得很困难。

我修改了代码,因此它对我来说很有意义(如果我正确理解了问题):

choise
是用户给出的任何可能的整数。首先要做的是验证
choice
是否可以作为列表
所有键的索引


if内的第二行接受相应的字典
all_key[choice]={'type':'pub','trust':'-','length'…}
在本词典中,获取键的值
keyid
。然后
选项
将是例如id
1234

我不确定我是否明白您的问题,您想要获取与提供的键(选项)关联的值从列表中?如果值作为字符串存储在
gpg.list\u keys()中,为什么要将用户输入转换为
int
?非常感谢,这是一个非常有名的工作方式。因此,这本新字典“enumerated_keys”专门有一些键,这些键是枚举的数字,值是相关的字典,对吗?除了从“for c”分配的编号之外,在这本新字典中没有其他键。看到这一点很令人惊讶,这对我的理解有很大帮助理解编程。非常感谢你Norrius!@Evan只是想说清楚,第二行(对于c来说是
,k in…
)所做的就是输出,它不会影响任何其他内容。
enumerated_keys = dict(enumerate(all_keys))  # {0: {'type': 'pub', ...}, 1: {'type': 'pub', ...}}
print('\n'.join('{}. {}'.format(c, k['uids']) for c, k in enumerated_keys.items()))  # matches your output format
choice = int(input("Choose key: "))
try:
    print(enumerated_keys[choice])
except KeyError:
    print("Invalid option!")
all_keys = gpg.list_keys()

for c, key in enumerate(all_keys):
    print('{}. {}'.format(c, key['uids']))

choice = int(input("Choose key: "))

# What does this do?
if choice in all_keys:
    choice = all_keys[choice]['keyid']