Python Forum
How to remove dict from a list?
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
How to remove dict from a list?
#1
Hello all

I have created this list with dictionary for all video files with their media details. I want to remove all dictonaries records from the list where 'format' is not 'HEVC'.

#!/usr/bin/env python3                                                           
                                                                                    
old_list = [                                                                        
{'fname': 'Welcome.mp4', 'format': 'HEVC', 'width': 1920, 'height': 1080, 'duration': 118.867, 'framerate': 30.0, 'fsize_byte': 4095489},
{'fname': 'tut.webm', 'format': 'VP9', 'width': 1152, 'height': 720, 'duration': 535.633, 'framerate': 23.976, 'fsize_byte': 17017448},
{'fname': 'Line.mp4', 'format': 'HEVC', 'width': 1920, 'height': 1080, 'duration': 141.8, 'framerate': 25.0, 'fsize_byte': 4495620},
{'fname': 'CAPITAL.MP4', 'format': 'AVC', 'width': 1280, 'height': 720, 'duration': 284.3, 'framerate': 30.0, 'fsize_byte': 26107717},
]                                                                                
                                                                                 
new_list = []                                                                    
                                                                                 
for i in old_list:                                                               
    print(i)                                                                     
                                                                                 
for rec in old_list:                                                             
    if rec.get('format') != 'HEVC':                                              
        new_list.append(rec)                                                     
                                                                                 
print()                                                                          
                                                                                 
for j in new_list:                                                               
    print(j) 
The output is like this:

Output:
{'fname': 'Welcome.mp4', 'format': 'HEVC', 'width': 1920, 'height': 1080, 'duration': 118.867, 'framerate': 30.0, 'fsize_byte': 4095489} {'fname': 'tut.webm', 'format': 'VP9', 'width': 1152, 'height': 720, 'duration': 535.633, 'framerate': 23.976, 'fsize_byte': 17017448} {'fname': 'Line.mp4', 'format': 'HEVC', 'width': 1920, 'height': 1080, 'duration': 141.8, 'framerate': 25.0, 'fsize_byte': 4495620} {'fname': 'CAPITAL.MP4', 'format': 'AVC', 'width': 1280, 'height': 720, 'duration': 284.3, 'framerate': 30.0, 'fsize_byte': 26107717} {'fname': 'tut.webm', 'format': 'VP9', 'width': 1152, 'height': 720, 'duration': 535.633, 'framerate': 23.976, 'fsize_byte': 17017448} {'fname': 'CAPITAL.MP4', 'format': 'AVC', 'width': 1280, 'height': 720, 'duration': 284.3, 'framerate': 30.0, 'fsize_byte': 26107717}
Right now I'm using for loop to iterate through list and dictionary, check for value and append to another newly created list.

Is there a better way? Do changes IN list rather than create another list.

Thanks
Reply
#2
use list comprehension.
also possible to use filter(), but list comprehension is preferred

of course there is option to not create full list in the first place or create just a generator expression
If you can't explain it to a six year old, you don't understand it yourself, Albert Einstein
How to Ask Questions The Smart Way: link and another link
Create MCV example
Debug small programs

Reply
#3
(Sep-28-2020, 07:09 AM)buran Wrote: use list comprehension.

old_list = [rec for rec in old_list if rec.get('format') != 'HEVC']
Is this the correct way?
Reply
#4
(Sep-28-2020, 08:04 AM)Denial Wrote:
(Sep-28-2020, 07:09 AM)buran Wrote: use list comprehension.

old_list = [rec for rec in old_list if rec.get('format') != 'HEVC']
Is this the correct way?

Yes, but only if you don't need the old_list.
You've overwritten the old_list with your new list.

There are often situations where you need to keep the original data and working with filters to select them.

You've also the possibility to remove an entry from your list, if you have a reference to the element inside.
first_dict = old_list[0] # getting the reference to the first element
old_list.remove(first_dict) # if first_dict is not in old_list -> ValueError
Almost dead, but too lazy to die: https://sourceserver.info
All humans together. We don't need politicians!
Reply
#5
(Sep-28-2020, 08:04 AM)Denial Wrote: Is this the correct way?
if you need to keep the old list
new_list = [rec for rec in old_list if rec.get('format') != 'HEVC']
If you can't explain it to a six year old, you don't understand it yourself, Albert Einstein
How to Ask Questions The Smart Way: link and another link
Create MCV example
Debug small programs

Reply
#6
(Sep-28-2020, 07:05 AM)Denial Wrote: I want to remove all dictonaries records from the list where 'format' is not 'HEVC'.

Comprehension/generator are very good solutions but following tries to address OP 'remove records from the list' objective:

for i, record in enumerate(old_list):
    if record['format'] != 'HEVC':
        old_list.pop(i)
I'm not 'in'-sane. Indeed, I am so far 'out' of sane that you appear a tiny blip on the distant coast of sanity. Bucky Katt, Get Fuzzy

Da Bishop: There's a dead bishop on the landing. I don't know who keeps bringing them in here. ....but society is to blame.
Reply
#7
@perfingo - you will be surprised what the result of your code is when the order of elements is different. Don't change list while iterating over it
old_list = [                                                                        
{'fname': 'Welcome.mp4', 'format': 'HEVC', 'width': 1920, 'height': 1080, 'duration': 118.867, 'framerate': 30.0, 'fsize_byte': 4095489},
{'fname': 'Line.mp4', 'format': 'HEVC', 'width': 1920, 'height': 1080, 'duration': 141.8, 'framerate': 25.0, 'fsize_byte': 4495620},
{'fname': 'tut.webm', 'format': 'VP9', 'width': 1152, 'height': 720, 'duration': 535.633, 'framerate': 23.976, 'fsize_byte': 17017448},
{'fname': 'CAPITAL.MP4', 'format': 'AVC', 'width': 1280, 'height': 720, 'duration': 284.3, 'framerate': 30.0, 'fsize_byte': 26107717},
]


for i, record in enumerate(old_list):
    if record['format'] != 'HEVC':
        old_list.pop(i)

print(old_list)
Output:
[{'fname': 'Welcome.mp4', 'format': 'HEVC', 'width': 1920, 'height': 1080, 'duration': 118.867, 'framerate': 30.0, 'fsize_byte': 4095489}, {'fname': 'Line.mp4', 'format': 'HEVC', 'width': 1920, 'height': 1080, 'duration': 141.8, 'framerate': 25.0, 'fsize_byte': 4495620}, {'fname': 'CAPITAL.MP4', 'format': 'AVC', 'width': 1280, 'height': 720, 'duration': 284.3, 'framerate': 30.0, 'fsize_byte': 26107717}]
it will work if you iterate over copy of the original list though
assigning list comprehension to old_list is solving OP of removing elements and keeping the same variable
If you can't explain it to a six year old, you don't understand it yourself, Albert Einstein
How to Ask Questions The Smart Way: link and another link
Create MCV example
Debug small programs

Reply
#8
(Sep-28-2020, 09:17 AM)buran Wrote: @perfingo - you will be surprised what the result of your code is when the order of elements is different. Don't change list while iterating over it
/.../
it will work if you iterate over copy of the original list though
assigning list comprehension to old_list is solving OP of removing elements and keeping the same variable

Mea culpa! What was I thinking? Through my lapse of attention I gave really bad advice and committed real sin (fortunately no puppies died). As smart people had said:

"If fact, in any programming language for most part if you mutate something while you iterating over it you living in state of sin and you deserve whatever happens to you" -- Raymond Hettinger, Python core-developer, Transforming Code into Beautiful, Idiomatic Python
I'm not 'in'-sane. Indeed, I am so far 'out' of sane that you appear a tiny blip on the distant coast of sanity. Bucky Katt, Get Fuzzy

Da Bishop: There's a dead bishop on the landing. I don't know who keeps bringing them in here. ....but society is to blame.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  unable to remove all elements from list based on a condition sg_python 3 373 Jan-27-2024, 04:03 PM
Last Post: deanhystad
  Remove numbers from a list menator01 4 1,251 Nov-13-2022, 01:27 AM
Last Post: menator01
  Membership test for an element in a list that is a dict value for a particular key? Mark17 2 1,161 Jul-01-2022, 10:52 PM
Last Post: Pedroski55
  Are list/dict comprehensions interpreted really sequentially? anata2047 3 1,413 May-31-2022, 08:43 PM
Last Post: Gribouillis
  Updating nested dict list keys tbaror 2 1,243 Feb-09-2022, 09:37 AM
Last Post: tbaror
  Remove empty keys in a python list python_student 7 2,901 Jan-12-2022, 10:23 PM
Last Post: python_student
  Remove an item from a list contained in another item in python CompleteNewb 19 5,551 Nov-11-2021, 06:43 AM
Last Post: Gribouillis
  What type of *data* is the name of a list/tuple/dict, etc? alloydog 9 4,255 Jan-30-2021, 07:11 AM
Last Post: alloydog
  .remove() from a list - request for explanation InputOutput007 3 2,177 Jan-28-2021, 04:21 PM
Last Post: InputOutput007
Question dict value, how to change type from int to list? swissjoker 3 2,692 Dec-09-2020, 09:50 AM
Last Post: perfringo

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020