简体   繁体   中英

How to get unique list of dictionaries based on 2 keys out of 4 in Python?

I have a list of dictionaries with items like below:

[
 {'release_id': 1,
  'issue_id': 1,
  'release_name': 'example1',
  'release_date': '2021-02-11',
 },
 {'release_id': 1,
  'issue_id': 2,
  'release_name': 'example1',
  'release_date': '2021-02-11',
 },
 {'release_id': 2,
  'issue_id': 3,
  'release_name': 'example2',
  'release_date': '2021-02-18',
 }
]

What I want to have is basically ignore the issue_ids, and have a unique list of releases like:

[
 {'release_id': 1,
  'release_name': 'example1',
  'release_date': '2021-02-11',
 },
 {'release_id': 2,
  'release_name': 'example2',
  'release_date': '2021-02-18',
 }
]

What I have so far is working but I am sure there is a more pythonic way to do this:

unique_ids = []
unique_list = []
for i in release_list:
    if i['release_id'] not in unique_ids:
        unique_ids.append(i['release_id'])
        unique_list.append({'release_id': i['release_id],
                            'release_name': i['release_name],
                            'release_date': i['release_date'],
                           })

print(unique_list)

Try this,

unique_list = []
dict = {}
for ele in release_list :
    for k , v in ele.items():
        if k == 'issue_id':
            continue
        else:
            dict[k] = v

    unique_list.append(dict.copy()) #You need to append a copy, otherwise
    # you are just adding references to the same dictionary over and over again:


#Here we use str(i) to create a unique string that represents the dictionary which is used to filter the duplicates. 
lst = list({str(i) : i for i in unique_list}.values())
print(lst)

You could make a temporary dictionary of the dictionaries list using 'release_id' as key and then reform the list out of the values of that temporary dictionary.

release_list = [
 {'release_id': 1,
  'issue_id': 1,
  'release_name': 'example1',
  'release_date': '2021-02-11',
 },
 {'release_id': 1,
  'issue_id': 2,
  'release_name': 'example1',
  'release_date': '2021-02-11',
 },
 {'release_id': 2,
  'issue_id': 3,
  'release_name': 'example2',
  'release_date': '2021-02-18',
 }
]

unique_list = [*{d['release_id']:d for d in release_list}.values()]
print(unique_list)

[{'release_id': 1, 'issue_id': 2, 'release_name': 'example1', 'release_date': '2021-02-11'}, 
 {'release_id': 2, 'issue_id': 3, 'release_name': 'example2', 'release_date': '2021-02-18'}]

This would not remove the issue_id but it would filter the list down to the distinct releases.

If you need the issue_id removed you can change it to:

[*{d['release_id']:d for d in release_list if [d.pop('issue_id')]}.values()]

[{'release_id': 1, 'release_name': 'example1', 'release_date': '2021-02-11'}, 
 {'release_id': 2, 'release_name': 'example2', 'release_date': '2021-02-18'}]

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