简体   繁体   中英

Append string to specific values in a list of dictionary - Python

This is my list of dictionary

pool = [{'node_name': '198', 'port': '22'}, {'node_name': '199','port':'22'}, 
{'node_name': '200', 'port': '22'}, {'node_name': '201', 'port': '22'}, 
{'node_name': '202', 'port': '22'}, {'node_name': '203', 'port': '22'}, 
{'node_name': '204', 'port':'22'}, {'node_name': '205', 'port': '22'}] 

I want to append node- as a prefix to the value for the key node_name . I want the output to be like the below

[{'node_name': 'node-198', 'port': '22'}, {'node_name': 'node- 
199','port':'22'}, 
{'node_name': 'node-200', 'port': '22'}, {'node_name': 'node-201', 'port': 
'22'}, {'node_name': 'node-202', 'port': '22'}, {'node_name': 'node-203', 
'port': '22'}, {'node_name': 'node-204', 'port':'22'}, {'node_name': 'node- 
 205', 'port': '22'}] 

Any help is much appreciated.

The other answers all create n new dictionaries and a new list to hold them.

It seems like a waste to do all this just to fit it in one line.

for d in x:
    if 'node_name' in d:
        d['node_name'] = 'node-'+d['node_name']

Will just modify one dictionary entry and not create any new objects (outside of replacing the strings).

If you knew the key to be in each dictionary,

for d in x: d['node_name'] = 'node-'+d['node_name']

boom - one line...

You can use dictionary unpacking:

pool = [{'node_name': '198', 'port': '22'}, {'node_name': '199','port':'22'}, {'node_name': '200', 'port': '22'}, {'node_name': '201', 'port': '22'}, {'node_name': '202', 'port': '22'}, {'node_name': '203', 'port': '22'}, {'node_name': '204', 'port':'22'}, {'node_name': '205', 'port': '22'}] 
new_pool = [{**i, 'node_name':f'node-{i["node_name"]}'} for i in pool]

Output:

[{'node_name': 'node-198', 'port': '22'}, {'node_name': 'node-199', 'port': '22'}, {'node_name': 'node-200', 'port': '22'}, {'node_name': 'node-201', 'port': '22'}, {'node_name': 'node-202', 'port': '22'}, {'node_name': 'node-203', 'port': '22'}, {'node_name': 'node-204', 'port': '22'}, {'node_name': 'node-205', 'port': '22'}]

Here using map and dictionary unpacking , also works in python 3.5:

>>> new_pool = list(map(lambda x: {**x,'node_name':'node-{}'.format(x['node_name'])},pool))

>>> print(*new_pool,sep='\n')
{'node_name': 'node-198', 'port': '22'}
{'node_name': 'node-199', 'port': '22'}
{'node_name': 'node-200', 'port': '22'}
{'node_name': 'node-201', 'port': '22'}
{'node_name': 'node-202', 'port': '22'}
{'node_name': 'node-203', 'port': '22'}
{'node_name': 'node-204', 'port': '22'}
{'node_name': 'node-205', 'port': '22'}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM