将字典列表中的字典表示为数字

时间:2017-05-31 19:28:53

标签: python dictionary

我试图让用户可以选择脚本应该运行多少(全部,选择少数,单个)字典列表。

目前我可以要求用户根据名为“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

词典列表不是静态的,将来会增加。

2 个答案:

答案 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)