Search code examples
pythonlistdictionarylist-comparison

Compare values in list of dicts in Python


I'm a newbie in Python. I have a list of members and a list of meetings (containing the member id):

memberList = [{'id': '1', 'name': 'Joe'},
{'id': '2', 'name': 'Jason'},
{'id': '3', 'name': 'Billy'}]

meetingList = [{'meetingId': '20', 'hostId' : '1'},
{'meetingId': '21', 'hostId' : '1'},
{'meetingId': '22', 'hostId' : '2'},
{'meetingId': '23', 'hostId' : '2'}]

Where the id of the member and the hostId of meeting is the same value.

Result: a list of member ids which has no meetings ['3'] or the list of dicts [{'id': '3', 'name': 'Billy'}]

What's the best and most readable way to do it?


Solution

  • You could build a set of hosts and then use a list comprehension to filter out the members:

    member_list = [{'id': '1', 'name': 'Joe'},
                   {'id': '2', 'name': 'Jason'},
                   {'id': '3', 'name': 'Billy'}]
    
    meeting_list = [{'meetingId': '20', 'hostId': '1'},
                    {'meetingId': '21', 'hostId': '1'},
                    {'meetingId': '22', 'hostId': '2'},
                    {'meetingId': '23', 'hostId': '2'}]
    
    # create a set of hosts
    hosts = set(meeting['hostId'] for meeting in meeting_list)  # or { meeting['hostId'] for meeting in meeting_list }
    
    # filter out the members that are in hosts
    res = [member['id'] for member in member_list if member['id'] not in hosts]
    print(res)
    

    Output

    [{'id': '3', 'name': 'Billy'}]
    

    For the id only output, do:

    res = [member['id'] for member in member_list if member['id'] not in hosts]
    print(res)
    

    Output

    ['3']