我试图让用户可以选择脚本应该运行多少(全部,选择少数,单个)字典列表。
目前我可以要求用户根据名为“instance_name”的键进行选择,但输入整个名称很麻烦。如果用户只需按Enter键,它将处理所有。列表中的所有字典都具有相同的键和结构。
data = r.json()
results = []
for i in data:
print(i['instance_name'])
option = input("Please select instance to generate report. To generate for all, simply press [Enter]: ")
if len(option):
for i in data:
if option in i['instance_name']:
results.append(
(i['aps']['id'], i['instance_name'], i['login'], i['password']))
else:
for i in data:
results.append(
(i['aps']['id'], i['instance_name'], i['login'], i['password']))
return results
数据如下所示:
>>> from pprint import pprint
>>> pprint(data[0])
{'aps': {'id': 'cd7f0e5f-dfad-41a8-ab99-52e7cbd75a94',
'modified': '2017-05-27T07:26:45Z',
'revision': 35,
'status': 'aps:ready',
'type': 'http://something/application/version'},
'instance_name': 'Test1',
'login': 'abcdd@xyz.com',
'password': 'xxxxxx'}
>>> type(data)
<class 'list'>
>>> len(data)
17
>>>
目前的输出是这样的:
C:\Code>python -i options.py
Test1
Test2
...
Test17
Please select instance to generate report. To generate for all, simply press [Enter]: Test1
[('cd7f0e5f-dfad-41a8-ab99-52e7cbd75a94', 'Test1', 'abcdd@xyz.com', 'xxxxxx')]
>>>
有没有办法在数字旁边代表这些名字?这样用户可以输入一个数字,或用逗号分隔多个数字来选择一个或多个实例?
1. Test1
2. Test2
...
17. Test17
词典列表不是静态的,将来会增加。
答案 0 :(得分:2)
使用enumerate
。
for i, dictionary in enumerate(dictionary_list):
print(i, dictionary['instance_name']
结果:
1 Test1
2 Test2
3 Test3
...
答案 1 :(得分:1)
这是我的方法。首先,创建一个&#34; index&#34;的地图。到词典。
data = [
{'instance_name': 'Test1', 'other': 'a'},
{'instance_name': 'Test2', 'other': 'b'},
{'instance_name': 'Test3', 'other': 'c'},
{'instance_name': 'Test4', 'other': 'd'}
]
mapped_data = dict(enumerate(data, 1))
# { 1: {'instance_name': 'Test1', 'other': 'a'},
# 2: {'instance_name': 'Test2', 'other': 'b'},
# 3: {'instance_name': 'Test3', 'other': 'c'},
# 4: {'instance_name': 'Test4', 'other': 'd'}}
然后,编写一个函数来查找字典,并给出&#34; index&#34;或instance_name
的值。
def get_data(key, mapping, attr):
k = key.strip()
# find first member of mapping.items() whose index or d[attr] matches
return next(d for i, d in mapping.items() if k == i or k == d[attr])
# binds mapped_data and 'instance_name' to the function
custom_get_data = lambda k: get_data(k, mapped_data, 'instance_name')
最后,设置提示并输入以引用这些对象。
indices = range(1, len(data) + 1) # [1, 2, 3, 4]
for i in indices:
print('{}. {}'.format(i, mapped_data[i]['instance_name']))
option = input('Enter a value, nothing, or a comma separated list: ')
if not option:
result_keys = indices
elif ',' in option:
result_keys = option.split(',')
else:
result_keys = [option]
results = map(custom_get_data, result_keys)