简体   繁体   中英

Filtering items in a list in a dictionary

In Python, I'm looking to edit a list of dictionaries so that they all have the same corresponding items in each dictionary.

For example, this is what I originally have in my list of dictionaries:

[{'name': 'clock'}, {'name': 'hours'}, {'name': 'nosotros'}, 
{'name': 'pinkfloyd'}, {'name': 'time'}, {'name': 'alarm clock', 'accuracy': 0.9196}, 
{'name': 'analogue', 'accuracy': 0.96998}, {'name': 'clock', 'accuracy': 0.99748}]

What I would like is to only have dictionaries with the corresponding 'name' but all instances of 'accuracy' removed. Basically, I want the following returned:

[{'name': 'clock'}, {'name': 'hours'}, {'name': 'nosotros'}, 
{'name': 'pinkfloyd'}, {'name': 'time'}, {'name': 'alarm clock'}, 
{'name': 'analogue'}, {'name': 'clock'}]

Please help guide me on how to do this!

Using a list comprehension:

dl = [{'name': 'clock'}, {'name': 'hours'}, {'name': 'nosotros'}, 
{'name': 'pinkfloyd'}, {'name': 'time'}, {'name': 'alarm clock', 'accuracy': 0.9196}, 
{'name': 'analogue', 'accuracy': 0.96998}, {'name': 'clock', 'accuracy': 0.99748}]
nl = [{'name': x['name']} for x in dl]
print(nl)

If you want to do this in a general way, you can take the intersection of the keys your dictionaries and then build a new list based on those keys:

list_o_dicts = [
    {'name': 'clock'}, {'name': 'hours'}, {'name': 'nosotros'}, 
    {'name': 'pinkfloyd'}, {'name': 'time'}, {'name': 'alarm clock', 'accuracy': 0.9196}, 
    {'name': 'analogue', 'accuracy': 0.96998}, {'name': 'clock', 'accuracy': 0.99748}
]

common_keys = set.intersection(*map(set, list_o_dicts)) # just {'name'}

output = [{k:d[k] for k in common_keys} for d in list_o_dicts]

output:

[{'name': 'clock'},
 {'name': 'hours'},
 {'name': 'nosotros'},
 {'name': 'pinkfloyd'},
 {'name': 'time'},
 {'name': 'alarm clock'},
 {'name': 'analogue'},
 {'name': 'clock'}]

If you had more than one common key this still works:

list_o_dicts = [
    {'name': 'alarm clock', 'accuracy': 0.9196}, 
    {'name': 'analogue', 'accuracy': 0.96998}, 
    {'name': 'clock', 'accuracy': 0.99748}
]

common_keys = set.intersection(*map(set, list_o_dicts)) # {'accuracy', 'name'}

[{k:d[k] for k in common_keys} for d in  list_o_dicts]

out:

[{'accuracy': 0.9196, 'name': 'alarm clock'},
 {'accuracy': 0.96998, 'name': 'analogue'},
 {'accuracy': 0.99748, 'name': 'clock'}]
in_list = [{'name': 'clock'}, {'name': 'hours'}, {'name': 'nosotros'}, 
{'name': 'pinkfloyd'}, {'name': 'time'}, {'name': 'alarm clock', 'accuracy': 0.9196}, 
{'name': 'analogue', 'accuracy': 0.96998}, {'name': 'clock', 'accuracy': 0.99748}]
new_list = [{k: v for k,v in ele.items() if k == 'name'} for ele in in_list]
print(new_list)

Output:

[{'name': 'clock'}, {'name': 'hours'}, {'name': 'nosotros'}, {'name': 'pinkfloyd'}, {'name': 'time'}, {'name': 'alarm clock'}, {'name': 'analogue'}, {'name': 'clock'}]

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