【问题标题】:Python: remove dictionaries from a list which have same value for a key so that the values of that key are unique for all the dictionaries in the listPython:从列表中删除具有相同键值的字典,以便该键的值对于列表中的所有字典都是唯一的
【发布时间】:2023-01-04 15:24:11
【问题描述】:

问题

假设我有以下词典列表:

givenValues=[
{'id': '0001', 'name': 'me'},
{'id': '0002', 'name': 'me'},
{'id': '0001', 'name': 'you'},
{'id': '0003', 'name': 'hi'},
{'id': '0001', 'name': 'they'},
{'id': '0002', 'name': 'me'},
{'id': '0002', 'name': 'me'}
]

要求的结果

我想保留每个唯一 ID 的第一个,并从列表中删除所有其他词典,这样的结果是

[
{'id': '0001', 'name': 'me'},
{'id': '0002', 'name': 'me'},
{'id': '0003', 'name': 'hi'}
]

到目前为止,我已经尝试了以下。如果列表中的字典排列不同但并非总是如此,则某些尝试确实有效:

尝试 1

tempList=[]
for i in range(len(givenValues)):
    for j in range(i+1, len(givenValues)):
        if givenValues[i]['id']==givenValues[j]['id']:
            tempList.append(givenValues[j])

for item in tempList:
    if item in givenValues:
        givenValues.remove(item)

结果:

[
{'id': '0001', 'name': 'me'},
{'id': '0003', 'name': 'hi'}
]

尝试 2

for i in range(len(givenValues)):
    if i<len(givenValues):
        for j in range(i+1, len(givenValues)):
            if i<len(givenValues) and givenValues[i]['id']==givenValues[j]['id']:
                givenValues.remove(givenValues[j])

结果

[
{'id': '0001', 'name': 'me'},
{'id': '0003', 'name': 'hi'},
{'id': '0001', 'name': 'they'},
{'id': '0002', 'name': 'me'}
]

请帮我解决这个问题。

【问题讨论】:

    标签: python python-3.x list


    【解决方案1】:

    这是一个可能的解决方案:

    data = [
        {"id": "0001", "name": "me"},
        {"id": "0002", "name": "me"},
        {"id": "0001", "name": "you"},
        {"id": "0003", "name": "hi"},
        {"id": "0001", "name": "they"},
        {"id": "0002", "name": "me"},
        {"id": "0002", "name": "me"},
    ]
    
    selected = {}
    
    for item in data:
        if item["id"] not in selected:
            selected[item["id"]] = item
    
    output = list(selected.values())
    
    print(output)
    

    我们使用字典来跟踪唯一的项目,我们利用了字典的 .values() 方法按插入顺序返回项目的事实(因此这保留了我们在原始项目中找到项目的顺序列表)。

    上面的代码输出:

    [{'id': '0001', 'name': 'me'}, {'id': '0002', 'name': 'me'}, {'id': '0003', 'name': 'hi'}]
    

    这是解决这个问题的另一种方法,使用itertools.groupby

    import itertools
    
    data = [
        {"id": "0001", "name": "me"},
        {"id": "0002", "name": "me"},
        {"id": "0001", "name": "you"},
        {"id": "0003", "name": "hi"},
        {"id": "0001", "name": "they"},
        {"id": "0002", "name": "me"},
        {"id": "0002", "name": "me"},
    ]
    
    output = []
    for k, g in itertools.groupby(sorted(data, key=lambda item: item['id']), lambda item: item['id']):
        output.append(next(g))
    
    print(output)
    

    这会产生相同的输出。它的工作原理是将列表中的项目按id 分组,然后从每组中取出第一项。

    【讨论】:

    • selected 应该只是一个 set
    猜你喜欢
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多