Python字典枚举循环到键/值

时间:2018-08-05 19:02:00

标签: 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': '', 'uids': ['john doe <john@doe.com>'], 'sigs': [], 'subkeys': [['1234', 'e', '1234']], 'fingerprint': 'abc1234'}]

我遍历并枚举列表:

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

# Loop returns
0. ['jane doe jane@doe.com']
1. ['jane doe jane@doe.com']

现在我想接受数字输入并将其转换为关联的键/ 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。

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

2 个答案:

答案 0 :(得分:1)

由于您已经标记了Python 3.6,所以我不建议您依赖两次调用之间的字典顺序是相同的。您可以将编号映射到GPG键作为另一个字典,并且由于dict具有constructor from an iterable of pairs,因此这是 非常简单:

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!")

我认为这里的主要思想是先创建映射“用户选择-> GPG密钥”,然后再将其呈现给用户。在您的代码中,您不会将enumerate的结果保存在任何地方,这显然使以后很难使用它。

答案 1 :(得分:1)

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

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']

choise是用户提供的任何可能的整数。首先要做的是验证choice可能是列表all_keys的索引

if内的第二行采用相应的字典all_keys[choice]={'type': 'pub', 'trust': '-', 'length' ...},在此字典中采用键keyid的值。然后choice将是ID 1234