精华内容
下载资源
问答
  • 列表去重是Python中一种常见的处理方式,任何...让我们先制造一些简单的数据,生成0到99的100万个随机数:fromrandomimportrandrangeDUPLICATES=[randrange(100)for_inrange(1000000)]接下来尝试这4种去重方式中最简...

    列表去重是Python中一种常见的处理方式,任何编程场景都可能会遇到需要列表去重的情况。

    列表去重的方式有很多,本文将一一讲解他们,并进行性能的对比。

    让我们先制造一些简单的数据,生成0到99的100万个随机数:

    from random import randrange

    DUPLICATES = [randrange(100) for _ in range(1000000)]

    接下来尝试这4种去重方式中最简单直观的方法:

    1.新建一个数组,遍历原数组,如果值不在新数组里便加入到新数组中。

    # 第一种方式

    def easy_way():

    unique = []

    for element in DUPLICATES:

    if element not in unique:

    unique.append(element)

    return unique

    进入ipython使用timeit计算其去重耗时:

    %timeit easy_way()

    # 1.16 s ± 137 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

    平均耗时在1.16秒左右,但是在这个例子中我们使用了数组作为存储对象,实际上如果我们改成集合存储去重后的结果,性能会快不少:

    def easy_way():

    unique = set()

    for element in DUPLICATES:

    if element not in unique:

    unique.add(element)

    return unique

    %timeit easy_way()

    # 48.4 ms ± 11.6 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

    平均耗时在48毫秒左右,改善明显,这是因为集合和数组的内在数据结构完全不同,集合使用了哈希表,因此速度会比列表快许多,但缺点在于无序。

    接下来看看第2种方式:

    2.直接对数组进行集合转化,然后再转回数组:

    # 第二种去重方式

    def fast_way()

    return list(set(DUPLICATES))

    耗时:

    %timeit fast_way()

    # 14.2 ms ± 1.73 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)

    平均耗时14毫秒,这种去重方式是最快的,但正如前面所说,集合是无序的,将数组转为集合后再转为列表,就失去了原有列表的顺序。

    如果现在有保留原数组顺序的需要,那么这个方式是不可取的,怎么办呢?

    3.保留原有数组顺序的去重

    使用dict.fromkeys()函数,可以保留原有数组的顺序并去重:

    def save_order():

    return list(dict.fromkeys(DUPLICATES))

    当然,它会比单纯用集合进行去重的方式耗时稍微久一点:

    %timeit save_order()

    # 39.5 ms ± 8.66 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

    平均耗时在39.5毫秒,我认为这是可以接受的耗时,毕竟保留了原数组的顺序。

    但是,dict.fromkeys()仅在Python3.6及以上才支持。

    如果你是Python3.6以下的版本,那么可能要考虑第四种方式了。

    4. Python3.6以下的列表保留顺序去重

    在Python3.6以下,其实也存在fromkeys函数,只不过它由collections提供:

    from collections import OrderedDict

    def save_order_below_py36():

    return list(OrderedDict.fromkeys(DUPLICATES))

    耗时:

    %timeit save_order_below_py36()

    # 71.8 ms ± 16.9 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

    平均耗时在72毫秒左右,比 Python3.6 的内置dict.fromkeys()慢一些,因为

    OrderedDict

    是用纯Python实现的。

    我们的文章到此就结束啦,如果你喜欢今天的Python 实战教程,请持续关注Python实用宝典。

    有任何问题,可以在公众号后台回复:

    加群

    ,回答相应验证信息,进入互助群询问。

    原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

    点击下方阅读原文可获得更好的阅读体验

    Python实用宝典 (pythondict.com)

    不只是一个宝典

    欢迎关注公众号:Python实用宝典

    展开全文
  • 列表去重中,根据其他语言的经验,比较容易想到的方式就是迭代删除以及set()方法。 列表总结起来处理无外乎 循环,排序,添加移除元素等操作,所以围绕这几方面考虑即可。 #coding=utf-8 ''' Created on ...

    在列表去重中,根据其他语言的经验,比较容易想到的方式就是迭代删除以及set()方法。

    列表总结起来处理无外乎 循环,排序,添加移除元素等操作,所以围绕这几方面考虑即可。

    #coding=utf-8
    '''
    Created on 2015年5月30日
    
    @author: frozen cloud
    '''
    
    #原始列表
    originalList = ['python','A','B','C','D','E','A','B','C','F']
    
    #使用set()方法,生成一个无序不重复元素集,在海量数据去重问题中set的效率高于hash
    #sorted()方法有四个参数:sorted(iterable, cmp=None, key=None, reverse=False) 
    #iterable迭代器,key列表元素的某属性作为关键字,cmp比较,比较的内容由key决定
    #reverse排序规则,正序、反序,返回值为与iterable相同类型的排序结果
    list1 = sorted(set(originalList),key = originalList.index)
    print list1
    
    #迭代
    list2 = []
    for i in originalList:
        if not i in list2:
            list2.append(i)
    print list2
    
    #集合转为列表,然后按照index排序
    list3 = list(set(originalList))
    list3.sort(key=originalList.index)
    print list3
    
    #keys()方法返回字典的所有键
    list4 = {}.fromkeys(originalList).keys()
    #转化为字典
    print {}.fromkeys(originalList)
    print list4
    
    #排序比较相邻元素,删除重复项
    def sortlist(originalList):
        originalList.sort()
        last = originalList[-1]
        for i in range(len(originalList)-2,-1,-1):
            if originalList[i] == last:
                originalList.remove(originalList[i])
            else:
                last=originalList[i]
        return originalList
    print sortlist(originalList)
    
    一次性运行结果如下:

    ['python', 'A', 'B', 'C', 'D', 'E', 'F']
    
    ['python', 'A', 'B', 'C', 'D', 'E', 'F']
    
    ['python', 'A', 'B', 'C', 'D', 'E', 'F']
    
    {'A': None, 'C': None, 'B': None, 'E': None, 'D': None, 'F': None, 'python': None}
    ['A', 'C', 'B', 'E', 'D', 'F', 'python']
    
    ['A', 'B', 'C', 'D', 'E', 'F', 'python']
    
    在以上去重方法中,第一种方式简洁高效,但是由于进行了排序,所以原有列表顺序被打乱。

    第二种方式,重新建立列表添加数据,逻辑清晰,效率也很不错。

    第四种方式,比第一种方式多了一步转化,必然效率不如第一种。

    第五种方式,临时变量消耗内存,效率较差。

    展开全文
  • 接口返回数据重复的问题,上面说的是服务端一次性全部返回的问题,这个呢就是分页后有可能会出现重复数据的问题。分页有份两种情况一种是接口有返回一共多少页这个不用说了遍历就行了,另一种就是没有说有多少页,接...

    背景:最近写接口测试的时候遇到一个比较特殊接口response,正好也用到采样的测试思想,就想拿出来写写。

    接口采样

    上一个app版本上了一个获取简历筛选的接口,服务端返回没有分页直接吐给客户端,json结构如下:

    {

    “code”:0,

    “name”:“success”

    “message”:"",

    "data":[

    {

    "postid":"",

    "posttitle":"",

     },......

     ]

     }

    这个很正常json结构体,目前我接口测试校验两个。1.正常返回。2.json结构体的key。response['data']是list类型。当list过长时,书写hope_response时编辑器特别卡,无法运行并且我估计check方法也会出现异常,造成脚本很不稳定。好维护稳定一直是我书写接口测试的目标。既然不成不全校验,那怎么办嘞,我也是想了好久,后来想到可以用采样的方法,既然response['data']是一个列表,那么我就随机出来一个索引index,response['data'][index]数据结构和我书写hope_response结构保持一致就认为正确的。思路有了写就成了。先上抓包的response,这样形象点,如图:

    图有限没有全部截图出来,线上数据有可能会出现更多的情况,而且除了response['data']列表过长之外,还有就是因为该接口返回有职位的报名信息,如果线上账号不时有数据变更,比如说用户报名我发布的职位,或者我添加报名,都会造成check方法报错,总要去维护查找case,很不实用,所以采样测试思想很重要。

    测试case如下:


    先写一个空的responre['data']把获取的索引拼上去,就可以了。上面这个就是

    接口重复数据验证

    接口返回数据重复的问题,上面说的是服务端一次性全部返回的问题,这个呢就是分页后有可能会出现重复数据的问题。分页有份两种情况一种是接口有返回一共多少页这个不用说了遍历就行了,另一种就是没有说有多少页,接下来说得就是这种情况。

    • 首先看一下接口请求,因为有数据重复的问题,服务端处理办法是请求时当参数request['page']=1时对应的request['first_apply_id']=0,如图:


    当request['page']>1时,要带上第一页的第一个的applyid,即request['first_appy_id']=applyid,如图:


    • 接口返回,response['data']也是列表,想要验证apply_id是否有重复,我的想法是直接遍历response['data']取apply_id放到空列表中校验即可,直观点上一张接口返回的图片,如图:
    • 页数。这个问题我真的想了好久,后来想到,因为接口一页固定返回10条数据,如果是10条数据我就page+1继续请求下一页,就算最后一页刚好10条也没有关系,下一页也是空嘛,如果不到10条就停止循环,思路就是这样,直接上我写code,如图:
    • 判断重复。这个就很写了,list有一个方法就是list.count()可以计算出列表中每个元素在列表出现的次数,当次数!=1是就说明有重复。如图:

    思路就是这样,最后上了我整条case的书写,希望可以帮助到别的小伙伴:


    最近在研究locust接口并发,看看能不能接口目前已有的接口写点东西,有点心得回头分享一下。





    展开全文
  • 1.新列表搜集法2.set集合去重3.itertools,groupby 去重1.#可以保证元素顺序列表推导式来创建一个包含重复元素的列表list=[ random.randiant(20,30) for i in range (15)]will show 15 random numbers#1. 用新列表...

    列表去重 NEW!

    1.新列表搜集法

    2.set集合去重

    3.itertools,groupby 去重

    1.#可以保证元素顺序

    列表推导式来创建一个包含重复元素的列表

    list=[ random.randiant(20,30) for i in range (15)]

    will show 15 random numbers

    #1.  用新列表搜集,之搜集不重复元素

    target_list=[]

    for element in list:

    if element not in target_list:

    target_list.append(element)

    #2 set 集合

    set(list) #将源列表传给set,自动去除重复元素

    #再转回list格式

    target_list=list(set(list))

    顺序无法保留

    #3 intertools___groupby

    dir help

    #需要对列表进行排序

    list.sort()

    it=itertools.groupby(list)

    #进行分组(相同元素就分为同一组)

    #遍历各组,得到的都是不同的元素

    for k,g in it:

    print (k,end='')

    #end='' '' 不换行

    展开全文
  • 主要介绍了python列表返回重复数据的下标,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 才接触爬虫,看了网上一个...写完代码发现,列表一直重复打印第一个链接里面的内容。求大佬告知如何解决。import requestsimport reimport bs4from bs4 import BeautifulSoupdef gethtml(url):try:r = requests.g...
  • 比如下面的例子,如何去除下面列表中的重复数据? data = [{‘name’:‘小华’,‘score’:100}, {‘name’:‘小A’,‘score’:98}, {‘name’:‘小Q’,‘score’:95}, {‘name’:‘小华’,‘score’:100}] 通常我们...
  • ls = [2,3,6,5,5,6,6,7] ls = set(ls) ls = list(ls) print(ls) 原理:数组是一个无序的不重复的序列,所以我们可以先把列表转化数组,然后再转化回列表,这样就能实现列表去重的需求。 ...
  • 如图所示为两条不同的留言,回复这一留言的数据和文本框都是遍历来的,显示的每条数据是正常的,但是获取值的时候都是重复的,原因在于每次获取的都是遍历的第一个内容及其文本框 ...
  • python 查找列表重复数据

    千次阅读 2020-03-14 20:22:09
    def find_repeat_data(name_list): """ 查找列表中重复的数据 ... :return: 一个重复数据列表列表中字典的key 是重复的数据,value 是重复的次数 """ repeat_list = [] for i in set(name_list): re...
  • 刚参加工作的时候写过一个类似评论功能的列表,但是在一个item中需要动态再次添加Item(就像朋友圈的评论列表一样),只要一使用ListView的缓存机制--ViewHolder,和 converView 判空就会出现数据混乱,花了好久不知道...
  • 判断List列表重复数据的个数

    千次阅读 2019-05-12 18:33:20
    判断List列表重复数据的个数.很简单一个逻辑,写下留做笔记 public class ListRepeat { public static void main(String[] args) { String[] stringBuf = {"a","b","c","a","e","a","a","b","c","e","b"}; ...
  • 解决思想:将列表转换为 集合,利用集合删除重复数据得特性删除重复数据,然后将集合转换为列表 #删除列表中得重复元素def delect_1 (lt): s = set(lt) lt = list(s) print(lt)delect_1([1,2,3,4,1,3,4,5]) 转载于...
  • 假设我有几个列表数据,例如4个:list1=['2','5','10']list2=['3','6','8']list3=['7','6','9']list4=['5','4','3']我如何找到列表中在其他的列表中含有的数据重复数据,比如说6在list2和list3都含有。就打印...
  • <div><p>之前在osc的安卓客户端上发现列表重复的时候,发了个动态,结果被osc客户端相关人员语气很不好说用的是老版本,我把版本号发他了,他不说话了,着实心里不爽,osc的...
  • 完整版组合框、列表框去重复数据妙法.rar
  • 1、数据还没有保存到数据库中 2、table列表主键:仓库编号,商品编号 3、判断是否有重复数据,并且把重复数据高亮显示,
  • Python如何判断列表里是否有重复元素发布时间:2020-10-28 02:54:38来源:亿速云阅读:122作者:小新小编给大家分享一下Python如何判断列表里是否有重复元素,希望大家阅读完这篇文章后大所收获,下面让我们一起去...
  • ringa_lee2017-04-17 11:34:461楼求集合的交集:>>> set2 = set(list2)>>> set3 = set(list3)>>> print set2 & set 3set(['6'])其他操作:>>... y = set('bd...
  • 完整版组合框、列表框去重复数据妙法.e.rar
  • 完整版组合框、列表框去重复数据妙法.bak.rar
  • class Solution(object): def searchRange(self, nums, target): """ :type nums: List[int] :type target: int :rtype: List[int] """ flag = 0 lis ...
  • # 列表去重,先使用set去重,然后使用for循环将集合转化成列表 list1 = [1, 2, 1, 3, 'a', 'b', 'b'] print("list1 原始数据是:%s" % list1) x = set(list1) print("list1 set之后的数据是:%s" % x) list2 = []...
  • 去除重复数据 如果是基本数据类型:(String类型也是如此) List list = new ArrayList();  List list2 = new ArrayList();  list.add(1);  list.add(1);  list.add(2);  list.add(2);  list.add(2); ...
  • mylist = ["a","a","b","c","c","c","d","d","d","d","e","f"] length = len(mylist) print(length) i = 0 while i < length: times = 1 passwordstr = mylist[i] while i < length-1:...
  • Python 小练习 剔除列表重复数据

    千次阅读 2016-06-24 16:30:02
    练习题目要求定义一个函数,变量是一个list,输出结果要求剔除重复出现的元素,只保留一次。 比如[1,2,2,3,3,4,4]-------->输出要求[1,2,3,4] def remove_duplicates(ori):  new=[] #新建一个列表,以防止...
  • Python序列删除重复数据 ## 对于列表来说,若不保持原有顺序,可以直接转换为set删除重复数据 nums = [1,2,32,2,2,4,3,2,3,42] nums = list(set(nums)) print(nums ... Python列表去除重复元素 主要尝试了3种列表去除...
  • from collections import Counterdef func1(num_list):'''直接使用set方法'''if len(num_list)!=len(set(num_list)):print 'have duplicates!!!'else:print 'no duplicates!!'def func2(num_list):'''使用collection...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,735
精华内容 2,694
关键字:

列表重复数据