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