首页 > 解决方案 > Python - 根据字典值从字典列表中删除重复项

问题描述

我有一个字典列表,其中包含一些重复的 ID,我想保留值在 rsrp 下的字典并删除具有 0 的字典,但如果有两次 rsrp 为 0 的重复项,我需要收下。

当前和所需的列表示例如下,有没有简单的方法可以做到这一点?使用循环查找非“0”很容易,但如果匹配的 id 为“0”,我不确定

current_list = [
    {'id': 255, 'rssi': -108.0},
    {'id': 255, 'rssi': '0'},
    {'id': 301, 'rssi': -82.0},
    {'id': 301, 'rssi': '0'},
    {'id': 263, 'rssi': -85.0},
    {'id': 263, 'rssi': '0'},
    {'id': 18, 'rssi': '0'},
    {'id': 18, 'rssi': '0'}
]

desired_list = [
    {'id': 255, 'rssi': -108.0},
    {'id': 301, 'rssi': -82.0},
    {'id': 263, 'rssi': -85.0},
    {'id': 18, 'rssi': '0'}
]

标签: pythondictionary

解决方案


itertools 食谱中有一个方法叫做unique_everseen

from itertools import filterfalse

def unique_everseen(iterable, key=None):
    "List unique elements, preserving order. Remember all elements ever seen."
    # unique_everseen('AAAABBBCCDAABBB') --> A B C D
    # unique_everseen('ABBCcAD', str.lower) --> A B C D
    seen = set()
    seen_add = seen.add
    if key is None:
        for element in filterfalse(seen.__contains__, iterable):
            seen_add(element)
            yield element
    else:
        for element in iterable:
            k = key(element)
            if k not in seen:
                seen_add(k)
                yield element

你可以用它来获得你想要的列表:

desired_list = list(unique_everseen(current_list, key=lambda x: x["rssi"]))
# [{'id': 255, 'rssi': -108.0}, {'id': 255, 'rssi': '0'}, 
#  {'id': 301, 'rssi': -82.0}, {'id': 263, 'rssi': -85.0}]

剩下要做的就是'rssi'使用 的key参数进行选择unique_everseen


推荐阅读