python中对list去重的多种方法,pythonlist
python中对list去重的多种方法,pythonlist
今天遇到一个问题,在同事随意的提示下,用了 itertools.groupby 这个函数。不过这个东西最终还是没用上。
问题就是对一个list中的新闻id进行去重,去重之后要保证顺序不变。
直观方法
最简单的思路就是:
ids = [1,2,3,3,4,2,3,4,5,6,1]
news_ids = []
for id in ids:
if id not in news_ids:
news_ids.append(id)
print news_ids
这样也可行,但是看起来不够爽。
用set
另外一个解决方案就是用set:
ids = [1,4,3,3,4,2,3,4,5,6,1]
ids = list(set(ids))
这样的结果是没有保持原来的顺序。
按照索引再次排序
最后通过这种方式解决:
ids = [1,4,3,3,4,2,3,4,5,6,1]
news_ids = list(set(ids))
news_ids.sort(ids.index)
使用itertools.grouby
文章一开始就提到itertools.grouby, 如果不考虑列表顺序的话可用这个:
ids = [1,4,3,3,4,2,3,4,5,6,1]
ids.sort()
it = itertools.groupby(ids)
for k, g in it:
print k
关于itertools.groupby的原理可以看这里:http://docs.python.org/2/library/itertools.html#itertools.groupby
网友补充:用reduce
网友reatlk留言给了另外的解决方案。我补充并解释到这里:
In [5]: ids = [1,4,3,3,4,2,3,4,5,6,1]
In [6]: func = lambda x,y:x if y in x else x + [y]
In [7]: reduce(func, [[], ] + ids)
Out[7]: [1, 4, 3, 2, 5, 6]
上面是我在ipython中运行的代码,其中的 lambda x,y:x if y in x else x + [y] 等价于 lambda x,y: y in x and x or x+[y] 。
思路其实就是先把ids变为[[], 1,4,3,......] ,然后在利用reduce的特性。reduce解释参看这里:http://docs.python.org/2/library/functions.html#reduce
import copy
a = [{'a':12,'b':21},{'a':13,'b':22},{'a':14,'b':22},{'a':15,'b':23},{'a':16,'b':22}]
d = {}
for i in a:
d.setdefault(i['b'], 0)
d[i['b']] += 1
at = copy.copy(a)
for i in at:
if d[i['b']] > 1:
a.remove(i)
print a
先把b值统计一下。然后再一个比对,如果统计个数大于1,就从列表中移出。
用set可以去除重复的
例如
x = [1,2,3,1,2,4]
list(set(x))
得到
[1, 2, 3, 4]
相关内容
- python进程管理工具supervisor使用实例,pythonsupervisor
- python写的一个squid访问日志分析的小程序,pythonsquid
- Python实现的检测web服务器健康状况的小程序,pythonweb
- python字符串连接的N种方式总结,python字符串总结
- Python多进程编程技术实例分析,python实例分析
- Python实现备份文件实例,
- Python专用方法与迭代机制实例分析,python实例分析
- 用Python实现QQ游戏大家来找茬辅助工具,python大家来找
- 跟老齐学Python之永远强大的函数,齐学python
- 跟老齐学Python之玩转字符串(1),齐学python
评论关闭