Skip to main content
 首页 » 编程设计

Python-根据字典值从字典列表中删除重复项

2025年05月04日20yyy_WW

我有一个字典列表,其中有一些重复的 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'} 
] 

请您参考如下方法:

在itertools recipes有一个名为 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}] 

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