Python:移除带不同后缀的列表重复项(WebSocket连接场景)
解决WebSocket连接列表按唯一前缀去重并保留首次出现项的问题
首先明确你的核心需求:在WebSocket ping测试场景中,你需要从一堆带不同后缀(/、/ws、/wss)的连接地址里,为每个唯一前缀保留列表中第一次出现的那个地址,最终得到一个无重复前缀的连接列表,用来测试延迟。
问题示例
输入列表:
['asdf/ws', 'abc/abc/', 'asdf/wss', 'asdf/', 'ab/wss', 'ab/ws', 'abc/abc/ws', 'xyz/wss']
期望输出:
['asdf/ws', 'abc/abc/', 'ab/wss', 'xyz/wss']
需求拆解
- 后缀固定为三种:
/、/ws、/wss - 前缀是去掉后缀后的部分,前缀可能包含多个斜杠(比如
abc/abc/去掉后缀/后,前缀是abc/abc) - 必须保留每个前缀在原列表中最左侧首次出现的对应连接
解决方案(Python实现)
这里用Python写一个简单的函数,完全匹配你的需求:
def filter_websocket_urls(url_list): # 定义允许的后缀集合,方便快速匹配 allowed_suffixes = {'/', '/ws', '/wss'} # 用字典记录已经处理过的前缀,确保每个前缀只保留第一个出现的URL seen_prefixes = {} result = [] for url in url_list: current_prefix = None # 遍历后缀,找到当前URL匹配的后缀并提取前缀 for suffix in allowed_suffixes: if url.endswith(suffix): # 截取去掉后缀后的部分作为前缀 current_prefix = url[:-len(suffix)] break # 如果URL没有匹配任何合法后缀,默认把整个URL当作前缀(可根据需求调整) if current_prefix is None: current_prefix = url # 前缀未出现过,就保留当前URL if current_prefix not in seen_prefixes: seen_prefixes[current_prefix] = url result.append(url) return result # 测试你的示例输入 input_urls = ['asdf/ws', 'abc/abc/', 'asdf/wss', 'asdf/', 'ab/wss', 'ab/ws', 'abc/abc/ws', 'xyz/wss'] filtered_urls = filter_websocket_urls(input_urls) print(filtered_urls) # 输出正好是你要的结果: ['asdf/ws', 'abc/abc/', 'ab/wss', 'xyz/wss']
代码说明
- 后缀匹配:通过
endswith()检查每个URL是否属于合法后缀,快速提取前缀 - 去重逻辑:用
seen_prefixes字典记录已经处理过的前缀,确保每个前缀只保留第一次遇到的URL - 顺序保留:因为是按原列表顺序遍历,所以结果列表的顺序和原列表中首次出现的顺序一致,完全符合你"保留左侧首个出现项"的要求
这个逻辑可以直接用到你的WebSocket ping场景中,拿到过滤后的列表后,就可以逐个测试延迟,选择最优连接了。
内容的提问来源于stack exchange,提问作者litepresence
相关产品推荐
相关产品推荐

