You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何过滤字符串数组,去除反向重复的成对条目?

问题描述

我有如下字符串数组:

[
  '192.168.1.1 - 192.168.2.2', 
  '192.168.2.2 - 192.168.1.1', 
  '192.168.8.8 - 192.168.9.9', 
  '192.168.9.9 - 192.168.8.8'
]

该数组本质结构为:

[
  'A - B', 
  'B - A',     
  'X - Y', 
  'Y - X'
]

希望从这类反向成对的条目中仅保留一个,得到如下结果数组:

[
  '192.168.1.1 - 192.168.2.2', 
  '192.168.8.8 - 192.168.9.9'
]

或者抽象后的结果:

[
  'A - B', 
  'X - Y'
]

请问该如何实现这一需求?


解决方案

核心思路

给每个条目生成唯一标识:拆分出两端的内容,按固定规则(比如字典序)排序后拼接成键。这样反向的两个条目会生成相同的键,利用这个键去重,只保留首次出现的原条目即可。

JavaScript 实现

const arr = [
  '192.168.1.1 - 192.168.2.2', 
  '192.168.2.2 - 192.168.1.1', 
  '192.168.8.8 - 192.168.9.9', 
  '192.168.9.9 - 192.168.8.8'
];

const seen = new Set();
const result = arr.filter(item => {
  // 拆分两端点并去除空格
  const [a, b] = item.split(' - ');
  // 生成排序后的唯一键
  const key = [a, b].sort().join('-');
  if (!seen.has(key)) {
    seen.add(key);
    return true;
  }
  return false;
});

console.log(result);
// 输出:['192.168.1.1 - 192.168.2.2', '192.168.8.8 - 192.168.9.9']

Python 实现

arr = [
    '192.168.1.1 - 192.168.2.2', 
    '192.168.2.2 - 192.168.1.1', 
    '192.168.8.8 - 192.168.9.9', 
    '192.168.9.9 - 192.168.8.8'
]

seen = set()
result = []
for item in arr:
    # 拆分两端点
    a, b = item.split(' - ')
    # 生成排序后的唯一键(元组可存入集合)
    key = tuple(sorted([a, b]))
    if key not in seen:
        seen.add(key)
        result.append(item)

print(result)
# 输出:['192.168.1.1 - 192.168.2.2', '192.168.8.8 - 192.168.9.9']

说明

  • 拆分字符串时,要匹配原数组的分隔符' - '(两端带空格),避免拆分错误。
  • 默认采用字典序排序,对于IP地址这类字符串有效,也可根据需求自定义排序逻辑。
  • 用集合记录已处理的键,保证去重操作的高效性。

内容的提问来源于stack exchange,提问作者Safwan Bardolia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 10:10:33