python - 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'}
]
解决方案
在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
。
推荐阅读
- laravel - Laravel + PhpStorm 缓存问题
- ios - GPS 地理位置权限对话框未在 iOS 中显示
- kubernetes-helm - Helm 暴露普罗米修斯仪表板
- python - 基于 Python tkinter 组合框输入选择的隐藏/显示框架(标签和小部件包装在框架内)
- hadoop - 如何删除 HDFS 中名称中包含工作的所有目录?(使用命令行)
- css - Chrome Firefox Edge 和 Safari 的 CSS 图像定义
- reactjs - activeClassName 不改变活动链接颜色
- python - 熊猫从字典中创建新列
- android - 支持非阻塞 IO 的 Android 的 HTTP 请求框架
- regex - BigQuery 正则表达式替换仅在模式中有一个字符时才有效