问题描述

对一个list=['a', 'a', 'b', 'c', 'a'],计算出截止每个位置为止去重后的元素个数。即:位置=0时, list[0:1] = ['a'],元素去重后个数为1

位置=1时, list[0:2] = ['a', 'a'],元素去重后个数为1

位置=2时, list[0:3] = ['a', 'a', 'b'],元素去重后个数为2

位置=3时, list[0:4] = ['a', 'a', 'b', 'c'],元素去重后个数为3

位置=4时, list[0:5] = ['a', 'a', 'b', 'c', 'a'],元素去重后个数为3

如何快速输出一个list=[1,1,2,3,3]? 当数据量小时可能怎么处理都ok,但如果数据量巨大,几种方法的效率就存在明显差别。

方法比较方法一

采用len(set(list)),去重后求长度,是最自然的想法,但是数据量大了以后效率比较底下。

import time

import pandas as pd

import numpy as np

def method1(list_value):

def _get_setlen(i, list_value):

return len(set(list_value[0: i]))

y = [_get_setlen(i, list_value) for i in range(len(list_value))]

return y方法二

梳理一下问题的逻辑,在每次计算当前位置数值时,检查当前位置的值是否在原有数据里出现过,能节省不少比较的成本。确实快了很多,但还是不够快。

def method2(list_value):

y = np.zeros(len(list_value))

y[0] = 1

for i in range(1, len(list_value)):

if list_value[i] in list_value[0: i]:

y[i] = y[i-1]

else:

y[i] = y[i-1] + 1

return y

方法三

想能不能借助numpy/pandas等性能较高的库,采用方法一的思路用value_counts去重。挨个去重的效率还是太低了。

def method3(list_value):

list_value = pd.Series(list_value)

def _get_setlen(i, list_value):

return len(list_value[0: i].value_counts())

y = [_get_setlen(i, list_value) for i in range(len(list_value))]

return y方法四

再次梳理一下问题的逻辑,我们可以先生成一个中间数组[1,0,1,1,0],代表是否是某个元素首次出现的位置,再对这个数组累加即可。

def method4(list_value):

y = np.zeros(len(list_value))

duplicate_list = list(set(list_value))

_index = [list(list_value).index(i) for i in duplicate_list]

y[_index] = 1

y = y.cumsum()

return y

效率对比

if __name__ == "__main__":

list_value = np.random.randint(0, 20, 1000)

for method in [method1, method2, method3, method4]:

start_time = time.time()

result = method(list_value)

print('mothod:%s, time cost:%s' % (str(method), str(time.time() - start_time)))

输出:

mothod: , time cost: 0.04685497283935547

test time 0.006468057632446289

mothod: , time cost: 0.006494283676147461

test time 0.6175649166107178

mothod: , time cost: 0.6175949573516846

test time 0.0009291172027587891

mothod: , time cost: 0.0009829998016357422

采用内置的库,并且分析问题将问题进行抽象,能大大提升计算效率。

python去重计数_如何python快速实现数组的去重计数相关推荐

  1. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  2. python 概率分布模型_使用python的概率模型进行公司估值

    python 概率分布模型 Note from Towards Data Science's editors: While we allow independent authors to publis ...

  3. python去重计数_用Python实现透视表的value_sum和countdistinct功能

    在pandas库中实现Excel的数据透视表效果通常用的是df['a'].value_counts()这个函数,表示统计数据框(DataFrame) df的列a各个元素的出现次数:例如对于一个数据表如 ...

  4. python去重计数_用Python做透视表之value_sum和value_countdistinct功能

    在pandas库中实现Excel的数据透视表效果通常用的是df['a'].value_counts()这个函数,表示统计数据框(DataFrame) df的列a各个元素的出现次数:例如对于一个数据表如 ...

  5. python对象引用计数器_在Python中借助计数器对象对项目进行计数

    python对象引用计数器 前提 (The Premise) When we deal with data containers, such as tuples and lists, in Pytho ...

  6. python 几何计算_【理解黎曼几何】6. 曲率的计数与计算(Python)

    曲率的独立分量# 黎曼曲率张量是一个非常重要的张量,当且仅当它全部分量为0时,空间才是平直的.它也出现在爱因斯坦的场方程中.总而言之,只要涉及到黎曼几何,黎曼曲率张量就必然是核心内容. 已经看到,黎曼 ...

  7. python 重复图片_删除重复文件或图片(去重)的python代码

    通过python爬虫或其他方式保存的图片文件通常包含一些重复的图片或文件, 通过下面的python代码可以将重复的文件删除以达到去重的目的.其中,文件目录结构如下图: # /usr/bin/env p ...

  8. python去重算法_使用Python检测文章抄袭及去重算法原理解析

    在互联网出现之前,"抄"很不方便,一是"源"少,而是发布渠道少:而在互联网出现之后,"抄"变得很简单,铺天盖地的"源"源 ...

  9. python机器学习预测_使用Python和机器学习预测未来的股市趋势

    python机器学习预测 Note from Towards Data Science's editors: While we allow independent authors to publish ...

  10. python dry原则_关于Python 的这几个技巧,你应该知道

    随着大数据时代的到来,我们每天都在接触爬虫相关的事情,这其中就不得不提及Python这门编程语言.我已经使用Python编程有多年了,即使今天我仍然惊奇于这种语言所能让代码表现出的整洁和对DRY编程原 ...

最新文章

  1. 和我一起学Windows Workflow Foundation(1)-----创建和调试一个WF实例(转)
  2. python解决实际问题的代码_Python代码规范问题及解决
  3. GDCM:SCU功能的测试程序
  4. 添加Godaddy二级域名子域名方法
  5. AviSynth——多种字幕效果伪实现方法
  6. Ionic 2.0 相关资料
  7. ajax获取session值_cookie和session基础知识学习
  8. [转]VC _T的用途
  9. 微信公号“架构师之路”学习笔记(一)-无限容量数据库架构设计(数据库分组、分片架构等)
  10. 更改计算机时间出现没有权限,win7系统修改时间时显示没有权限的解决方法
  11. java同期_Java日期处理-本期,同期,上期
  12. 精密划片机——晶圆切割百科
  13. 国庆节上映的电影有哪些?2014国庆节上映的动画电影盘点
  14. linux 修改hosts立即生效设置
  15. 程序员实现 财务自由的 40 个案例
  16. #一日一图#自己的小窝舒服
  17. discuz论坛出现“请求来路不明”提示的解决方法
  18. bst latex 最大作者数_请教!如何修改bst文件,使作者姓名改为“Peng H”这样的格式...
  19. 移动设备是一种口袋大小的计算机设备,移动设备视频格式如何转换?
  20. 网站无法用localhost打开,修复localhost一切常见错误,一次性去除病根

热门文章

  1. js设置页面语音播放
  2. idea Java 读取MacOS 本地的 rtf 文件内容:中英文皆可
  3. 采购入库单记帐后在明细帐等不显示
  4. 使用fiddle抓包使用教程
  5. 【数学几何】四等分的角度
  6. non-broadcastable output operand with shape ()
  7. 如何获取网页高度、屏幕高度、滚动高度?
  8. 怎样用java实现文件比较,判断是否是同一个文件
  9. 港联证券投资前瞻:新能源汽车再迎助力 科技巨头持续加注机器人领域
  10. 使用小马哥win10 激活工具激活后, 桌面上经常出现一个广告快捷方式的 解决方法...