鱼C论坛

 找回密码
 立即注册
查看: 3074|回复: 19

python 里面的列表去重

[复制链接]
发表于 2016-7-26 22:04:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
python 里面有没有像C++样的去重函数?
我没找到。。。比如:m=[1,2,3,4,3,2,1]
m.remove(2)

m=[1,3,4,3,2,1]

后面的2呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-26 22:12:21 | 显示全部楼层
sorted(set(m))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-26 22:17:14 | 显示全部楼层
你理解的去重是什么意思?
我觉得应该是对于有多个重复的元素,最后只保留一个吧。
所以在你的例子里面,原列表有两个2,删完以后剩一个,应该没问题吧?

只不过去重的时候不可以直接用remove方法,这只会删除第一个你指定删除的数,而且跟是否重复没有关系
有一个简单的办法,但是有可能会破坏数组原来的顺序
  1. m=[1,2,3,2,4,2]
  2. m=list(set(m))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-26 22:38:41 | 显示全部楼层
shuofxz 发表于 2016-7-26 22:17
你理解的去重是什么意思?
我觉得应该是对于有多个重复的元素,最后只保留一个吧。
所以在你的例子里面, ...

这种方法,直接去掉重复的,然后顺序排序,那假如,m=[1,2,5,3,2,1,4,6]
我想去除里面的2,得到,m=[1,5,3,1,4,6]呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-26 22:52:57 | 显示全部楼层
小财迷 发表于 2016-7-26 22:38
这种方法,直接去掉重复的,然后顺序排序,那假如,m=[1,2,5,3,2,1,4,6]
我想去除里面的2,得到,m=[1,5 ...

我暂时没想到能够直接用一个函数解决的。不过有下面的一个方法
  1. >>> n=[]
  2. >>> m=[1,2,5,3,2,1,4,6]
  3. >>> [n.append(i) for i in m if i != 2]
  4. >>> print(n)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-7-27 08:25:11 | 显示全部楼层
shuofxz 发表于 2016-7-26 22:52
我暂时没想到能够直接用一个函数解决的。不过有下面的一个方法

非常感谢^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-27 08:36:38 | 显示全部楼层
shuofxz 发表于 2016-7-26 22:52
我暂时没想到能够直接用一个函数解决的。不过有下面的一个方法

额,不好意思啊,操作的时候又出现一个问题:

>>>m=[1,2,5,3,2,1,4,6]
>>>n=[]
>>>[n.append(i) for i in m if i != 2]
[None,None,None,None,None,None]
>>>print(n)
[1,5,3,1,4,6]

中间出现的那一串[None,None,None,None,None,None],,是为什么啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-27 08:46:39 | 显示全部楼层
本帖最后由 SixPy 于 2016-7-27 08:47 编辑
小财迷 发表于 2016-7-27 08:36
额,不好意思啊,操作的时候又出现一个问题:

>>>m=[1,2,5,3,2,1,4,6]


L.append(object) -> None

append 操作完后返回 None

[n.append(i) for i in m if i != 2]
这是个列表生成式,append 返回的 None 都装载 新生成的列表里边了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-27 08:58:04 | 显示全部楼层
也可以用 pop 方法
m=[1,2,5,3,2,1,4,6]
[m.pop(i) for i in range(len(m)-1,-1,-1) if m[ i ]==2 ]
print(m)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-27 09:01:37 | 显示全部楼层
SixPy 发表于 2016-7-27 08:46
L.append(object) -> None

append 操作完后返回 None

还是有点不懂,意思是,把值都给n后,会返回None,None 是本身存在于append()对象中的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-27 09:07:04 | 显示全部楼层
如果你装有 numpy 模块,就方便很多了

  1. import numpy as np
  2. m=np.array([1,2,5,3,2,1,4,6])
  3. m=list(m[m != 2])
  4. print(m)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-27 09:09:09 | 显示全部楼层
如果不需保留原来的次序,用集合的方法最方便。
如需保留次序,可以这样写:
  1. m=[1,2,5,3,2,1,4,6]
  2. n = []
  3. for each in m:
  4.     if each not in n:
  5.         n.append(each)
  6. print(n)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-27 09:11:38 | 显示全部楼层
SixPy 发表于 2016-7-27 08:58
也可以用 pop 方法
m=[1,2,5,3,2,1,4,6]
[m.pop(i) for i in range(len(m)-1,-1,-1) if m[ i ]==2 ]

我操作了,结果是对的,但我还是有点不懂
额,这个,有点晕了 range(len(m)-1,-1,-1) 其中len(m)-1 是最后一个,-1也是最后一个,-1步长,从最后一个到最后一个,这个,理解有点困难
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-27 09:16:53 | 显示全部楼层
本帖最后由 SixPy 于 2016-7-27 09:26 编辑

[strik]aaaaaaaa[/strik]

论坛不支持 删除线 格式
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-27 09:21:09 | 显示全部楼层
SixPy 发表于 2016-7-27 09:07
如果你装有 numpy 模块,就方便很多了

非常感谢,感觉学到好多,我自己再在网上查下,消化下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-27 09:22:08 | 显示全部楼层
小财迷 发表于 2016-7-27 09:11
我操作了,结果是对的,但我还是有点不懂
额,这个,有点晕了 range(len(m)-1,-1,-1) 其中len(m)-1 是最 ...

range(len(m)-1,-1,-1)
就是 从 m 的尾部到 头部 依次循环

等价的写法:
range(len(m))[::-1]

你显示一下就知道了

print(list(range(len(m))[::-1]))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2016-7-27 09:26:57 | 显示全部楼层
冬雪雪冬 发表于 2016-7-27 09:09
如果不需保留原来的次序,用集合的方法最方便。
如需保留次序,可以这样写:

好的,好的,非常感谢^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-27 09:32:17 | 显示全部楼层
SixPy 发表于 2016-7-27 09:22
range(len(m)-1,-1,-1)
就是 从 m 的尾部到 头部 依次循环

熬,是左闭右开区间,所以到0结束 [len(m),-1)
懂了,非常感谢^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-27 09:51:40 | 显示全部楼层
用 remove 也是可以的~
  1. m=[1,2,5,3,2,1,4,6]
  2. x=2
  3. for i in range(m.count(x)):
  4.         m.remove(x)
  5. print(m)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-27 10:19:54 | 显示全部楼层
SixPy 发表于 2016-7-27 09:51
用 remove 也是可以的~

666,^_^
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 03:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表