holly.woo
holly.woo

Reputation: 15

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?

Upvotes: 1

Views: 123

Answers (2)

Ryan Ward
Ryan Ward

Reputation: 306

I'd extract out the id's from both lists of dictionaries and compare them directly.

First I'm just rewriting your list variables to assign them with =. Using : won't save the variable.

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'}]

Then use list comprehension to extract out the id's from each list of dicts.

member_id_list = [i["id"] for i in memberList]
meeting_hostid_list = [i["hostId"] for i in meetingList]

You could also use list comprehension here but if you aren't familiar with it, this for loop and if logic will print out any member id who isn't a host.

for i in member_id_list:
    if i not in meeting_hostid_list:
        print(i)

>> 3

Upvotes: 0

Dani Mesejo
Dani Mesejo

Reputation: 61930

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']

Upvotes: 2

Related Questions