非常简单的二维数组去重

本文介绍了一种针对包含name和age属性的对象数组进行去重的方法,包括双重循环比对及使用对象存储唯一项的方式,并提供了去除特定属性重复项的示例。

前几天有朋友问我数组去重怎么做,我说简单的数组去重很简单啊,他说是对象形式的,我想了想,也有了点思路。

  但是我还是上网查了一下,各路大神四面八方杀来,我觉得很麻烦,而且有的方法还不适用我的数组需求,下面进入正题:

需求是:去除数组中name与age都相同的项;

<script type="text/javascript">

$(document).ready(function(){
var oldArr = [
        {name:1,age:1},
        {name:2,age:2},
        {name:2,age:2},
        {name:3,age:3},
        {name:3,age:4},
        {name:4,age:5},
        {name:4,age:4},
        {name:4,age:0},
        {name:5,age:6},
        {name:5,age:6},
        {name:1,age:0},
        {name:1,age:0},
        {name:2,age:0},
        {name:3,age:0},
        {name:1,age:0},
    ];
    for (var i = 0; i < oldArr.length - 1; i++) {
    for (var j = 1; j < oldArr.length; j++) {
        if (i != j) {
            if (oldArr[i].name == oldArr[j].name && oldArr[i].age == oldArr[j].age) {
                oldArr.splice(j, 1)
            }
        }

    }
}
     console.log(oldArr)
    
})

</script>

这样一个二维数组去重就解决了。

 

是不是非常简单易懂。

当然了,对于大神来说,这不是太low了么,而且他的效率也很慢,下面再呈现一种简单的方法 GO=>

数组还是那个数组 ;

const obj = {};

for(const item of oldArr){

        obj[item.name+','+item.age] = item 

}

oldArr = Object.values(obj)

console.log(oldArr) //现在就得到大家想要的结果了。

 

如果说需求改成只需要去除对象中某一项相同的项,怎么做呢,那就简单了,咱们就举例去除name相同的项;

const obj = {};

oldArr = oldArr.reduce((cur,next)=>{

       obj[next.name] ? '' : obj[next.name] = true && cur.push(next)

       return cur;

},[])

cosnole.log(oldArr)  //搞定

最后再给大家奉上一种基本类型数组去重的方法

var  arr = [1,1,2,2,3,3,4,4,5,5];

function dist(arr){

     return arr.reduce((acc,cur) => {

            acc.includes(cur)   || acc.push(cur)

              return acc;

      },[])  //别忘了最后这个参数啊!这叫做归并基础的初始值

}

去重的方法还有很多种   ES6的set去重更简单,多了解一些总没有坏处,大家继续加油!!!

<think>首先,用户的问题是:“我想在Python中对二维数组进行操作 请问Python 二维数组方法”。这涉及到Python中处理二维数组的技术。 根据系统级指令: - 所有行内数学表达式必须使用$...$格式,但在这个问题中,没有明显的数学表达式,所以可能不需要。 - 独立公式必须使用$$...$$格式,但这里可能不适用。 - LaTeX语法正确,但在这个上下文中,主要是代码和文本。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾添加引用标识。 用户提供了几个引用,我需要参考这些引用。引用是关于Python和PHP二维数组的,但用户的问题是针对Python的。 关键引用: - 引用[1]:提到np.unique()对一维和二维数组,但二维数组需要自定义。 - 引用[2]:使用numpy的np.unique()对二维数组,但结果不如预期,因为np.unique()默认对一维数组。 - 引用[3]:展示PHP二维数组的方法,使用一个键来。 - 引用[4]:PHP二维数组,使用array_unique。 用户的问题是Python的,所以我需要提供Python的解决方案。 在Python中,二维数组通常可以用列表的列表表示,例如:[[1,2], [3,4], [1,2]]。意味着移除复的子列表。 方法: 1. **使用set和tuple**:因为列表是不可哈希的,不能直接放入set。所以,将每个子列表转换为元组(tuple),因为元组是可哈希的。然后使用set,最后转换回列表。 - 示例代码:`unique_list = list(set(tuple(item) for item in list_2d))`,但这样会改变顺序。 - 要保持顺序,可以使用`dict.fromkeys()`或循环。 2. **使用numpy**:如果数组是NumPy数组,可以使用`np.unique()`,但它默认对一维数组。对于二维数组,需要指定`axis=0`。 - 示例:`np.unique(arr, axis=0)`。 3. **自定义函数**:如果数组中的元素是字典或需要基于特定键,可以类似引用[3]的方法,使用一个键。 在引用[2]中,提到np.unique()不能直接用于二维数组,因为它会扁平化数组。但实际在NumPy中,可以使用`axis=0`参数来按行。 验证NumPy的行为: - `np.unique(c, axis=0)` 应该可以复的行。 在引用[2]中,用户说“然而并不能达到预期”,可能是因为没有指定axis参数。 所以,在回答中,我应该: - 解释Python中二维数组的方法。 - 提供代码示例。 - 参考引用,但基于用户的问题。 回答结构: - 先介绍问题。 - 然后提供解决方案。 - 最后生成相关问题。 使用中文回答。 步骤: 1. **介绍**:简述二维数组的需求。 2. **方法1:使用纯Python**: - 将子列表转换为元组,使用set。 - 示例代码。 3. **方法2:使用NumPy**: - 如果安装了NumPy,使用`np.unique(axis=0)`。 - 示例代码。 4. **注意事项**:如顺序保持、元素类型。 5. **生成相关问题**:基于主题,生成2-3个问题。 引用处理: - 在回答中,提到引用时添加标识,如[^1]。 - 引用[2]直接相关,可以引用。 生成相关问题: - 例如: 1. 如何在Python中保持顺序二维数组? 2. 如果二维数组元素是字典,如何基于键? 3. NumPy中方法的性能如何? 最终回答应包括: - 清晰的结构。 - 代码块。 - 相关问题。</think>### Python二维数组方法 在Python中,二维数组通常表示为列表的列表(如 `[[1,2], [3,4], [1,2]]`)。操作需要移除复的子列表。以下是几种高效且可靠的方法,基于纯Python和NumPy库实现。我会逐步解释并提供代码示例,确保方法真实可靠(参考了相关技术文档和社区实践)。 #### 方法1: 使用纯Python(保持顺序) 如果不需要额外依赖库,可以将每个子列表转换为可哈希的元组(tuple),利用集合(set),再转换回列表。此方法简单,但默认不保留顺序;如需保持顺序,可使用`dict.fromkeys()`。 **代码示例**: ```python def remove_duplicates_2d(arr): # 使用字典键的唯一性保持顺序 unique_tuples = dict.fromkeys(tuple(item) for item in arr) unique_list = [list(item) for item in unique_tuples] return unique_list # 测试 arr = [[1,2], [3,4], [1,2], [5,6], [3,4]] print(remove_duplicates_2d(arr)) # 输出: [[1,2], [3,4], [5,6]] ``` - **优点**:无需外部库,适用于小规模数据。 - **缺点**:如果子列表元素不可哈希(如包含字典),需先处理;顺序保持依赖Python 3.7+的字典特性。 #### 方法2: 使用NumPy库(高效处理大数组) NumPy提供`np.unique()`函数,通过指定`axis=0`参数,可直接对二维数组按行。此方法高效且简洁,但需安装NumPy(`pip install numpy`)。 **代码示例**: ```python import numpy as np def remove_duplicates_numpy(arr): # 将列表转换为NumPy数组,并 np_array = np.array(arr) unique_array = np.unique(np_array, axis=0) return unique_array.tolist() # 测试 arr = [[1,2], [3,4], [1,2], [5,6], [3,4]] print(remove_duplicates_numpy(arr)) # 输出: [[1,2], [3,4], [5,6]] ``` - **优点**:性能高,适合大型数据集;直接处理数值型数组[^2]。 - **缺点**:需安装NumPy;如果子列表长度不一致,会报错(需确保所有子列表长度相同)。 #### 注意事项 - **元素类型**:如果二维数组包含非数值元素(如字符串或混合类型),上述方法均适用。 - **顺序问题**:NumPy的`np.unique()`默认不保留原始顺序(输出按排序后顺序)。如需保持顺序,可结合方法1的字典技巧。 - **引用说明**:NumPy的`axis=0`参数是关键,避免直接使用`np.unique()`导致扁平化错误[^2]。PHP中的二维数组方法(如基于键)在Python中可类似实现,但Python更简洁[^3]。 #### 性能对比 - **小数组**(<1000行):纯Python方法更快(O(n)复杂度)。 - **大数组**(>1000行):NumPy方法显著更优(底层C优化,O(n log n)复杂度)。 ### 相关问题 1. 如何在Python中二维数组并保持原始顺序? 2. 如果二维数组中的元素是字典,如何基于特定键? 3. NumPy的`np.unique()`方法在时有哪些限制和优化技巧? [^1]: np.unique()对一维和二维数组。php二维数组 前言:php一维数组很简单,直接array_unique($arr)即可,但是二维数组就得自己写了 二维数组方法: /* * 二维数组 * 注意:二维数组中的元素 ... [^2]: python 数组_如何使用python将二维数组呢?二维数组,能和一维的方法类似吗?import numpyc=np.array(((1,2),(3,4),(5,6),(7,8),(7,8),(3,4),(1,2)))print('二维数组:\n',c)print('后:',np.unique(c))然而并不能达到预期,好伤心....原因:... [^3]: python二维数组_二维数组二维数组《一》$existedarr=$leftresult=array();foreach($project_left_list as $one){if(!in_array($one['memberid'],$existedarr)){$leftresult[]=$one;$existedarr[]=$one['memberid'];}}《二》function assoc_unique($arr, $key){$tmp_arr = array();foreach($arr as $k => $v){if(in_array($v[$key], $tmp_arr))//搜索$v[$key]是否在$tmp_arr数组中存在,若存在返回true{unset($arr[$k]);}else {$tmp_arr[] = $v[$key];}}sort($arr); //sort函数对数组进行排序return $arr;}$aa = array(array('id' => 123, 'name' => '张三'),array('id' => 123, 'name' => '李四'),array('id' => 124, 'name' => '王五'),array('id' => 125, 'name' => '赵六'),array('id' => 126, 'name' => '赵六'));$key = 'id';assoc_unique(&$aa, $key);print_r($aa); [^4]: python二维数组复_php二维数组,array_unique出除复数据。$temp2[$k]=!empty($temp2[$k])?array_merge($temp2[$k],array("{$key[$i]}"=>$t)):array("{$key[$i]}"=>$t);//依次添加到新的数组
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值