美文网首页
在列表、字典、集合中根据条件筛选数据

在列表、字典、集合中根据条件筛选数据

作者: 慧琴如翌 | 来源:发表于2018-04-26 18:17 被阅读17次

    一、列表的过滤

    1.传统做法是:

    data = [1,5,-3,-4,6]
    res = []
    for x in data:
        if x>=0:
            res.append(x)
    print res    # [1, 5, 6]
    
    

    2.filter过滤

    from random import randint
    data = [randint(-3,3) for _ in xrange(5)]
    print data   # [0, 1, -1, -1, 2]
    
    print filter(lambda x:x>=0,data)  # [0, 1, 2],x接收的是data中的每一项,返回的是x>=0的项到最后的结果中
    

    3. 列表解析:

    print [x for x in data if x>=0]
    

    两种方法那种好呢?

    In [19]: data = [-2,9,3]
    
    In [20]: timeit [x for x in data if x>=0]
    The slowest run took 13.69 times longer than the fastest. This could mean that an intermediate result is being cached.
    1000000 loops, best of 3: 296 ns per loop
    
    In [21]: timeit [x for x in data if x>=0]
    1000000 loops, best of 3: 289 ns per loop
    

    总结:一般推荐使用列表解析


    二、字典

    根据字典的值过滤字典

    d = {x:randint(60,100) for x in xrange(1,21)}  # 生成的d是一个字典,现在过滤出来值高于90的项
    
    print {k:v for k,v in d.items() if v>90}  # {1: 100, 3: 97, 6: 98, 9: 100, 12: 95, 13: 93, 17: 100, 18: 91}
    
    

    三、集合

    data = [randint(-3,3) for _ in xrange(5)]
    s = set(data)    # s: {0, 2, 3}
    
    print {x for x in s if x%3==0}
    

    其他代码演示:

    
    list1 = ['b', 'c', 'd', 'b', 'c', 'a', 'a']
    
    
    
    # 创建字典的方式
    def dict1():
        x = {"a":"1", "b":"2"}
        print x    #输出:{'a': '1', 'b': '2'}
    
    
    def dict2():
        print dict(a='1',b='2')  # {'a': '1', 'b': '2'}
        print dict(a=1,b=2)  # {'a': 1, 'b': 2}
        # print dict('a'=1,'b'=2)  # 会报错
        # dict的入参是一个元组,元组内部是"一系列"包含两个值的元组或list
        print dict(([1,3],[2,4]))  # {1: 3, 2: 4}
        print dict((['a',3],['b',4],['c',3]))  # {'a': 3, 'c': 3, 'b': 4}
        print dict((('a',3),('b',4)))  # {'a': 3, 'b': 4}
        print dict((('a',3),['b',4]))  # {'a': 3, 'b': 4}
    
        # dict的入参是一个列表,列表内部是一系列包含两个值的元组或list
        print dict([['a',3],['b',4]])  # {'a': 3, 'b': 4}
        print dict([('a',3),['b',4]])  # {'a': 3, 'b': 4}
        print dict((('a',3),('b',4)))  # {'a': 3, 'b': 4}
    # dict2()
    
    def dict3():
        print dict.fromkeys(['a','b'])  # {'a': None, 'b': None}
        print dict.fromkeys(['a','b'],1) # {'a': 1, 'b': 1}
    
    
    # 字典的更新函数
    def dict_update():
        dict = {'a':1,'b':2}
        dict1 = {'sex':'male','age':28}
        dict.update(dict1)
        print dict  # {'a': 1, 'age': 28, 'b': 2, 'sex': 'male'}
        print dict1  # {'age': 28, 'sex': 'male'}
    
    # dict_update()
    
    # zip的用法
    
    def zip1():
        a = [1,2,3]
        b = [4,5,6]
        zipped = zip(a,b)
        print zipped    #[(1, 4), (2, 5), (3, 6)]
        c = (1,2,3)
        d = (4,5,6)
        zipped2 = zip(c,d)
        print zipped2  #[(1, 4), (2, 5), (3, 6)]
    
    # zip的结果可以作为入参生成字典
    def zip2():
        a = [1,2,3]
        b = [4,5,6]
        zipped = zip(a,b)    # [(1, 4), (2, 5), (3, 6)]
        dict1 = dict(zipped)  # {1: 4, 2: 5, 3: 6}
        print dict1
    # zip2()
    
    
    
    # 字符串、list、tuple转换
    def transf():
        s1 = 'python'
    
        #  string---->list
        l1 = list(s1)   # ['p', 'y', 't', 'h', 'o', 'n']
        print l1
    
        # list---->string
        s2 = ''.join(l1)
        print s2,type(s2)  # python <type 'str'>
    
        # list----tuple
        t1 = tuple(l1)
        print t1  # ('p', 'y', 't', 'h', 'o', 'n')
    
        # string----->list(整体的list)
        print s1.split()   # ['python']
        s3 = 'a b c'
        print s3.split()  #['a', 'b', 'c']
    
        # list中的字符串拼接起来
        l2 = ['i','love']
        print ''.join(l2),type(''.join(l2))    # ilove    <type 'str'>
    
        import re
        a='Beautiful, is; better*than\nugly'
        # 四个分隔符为:,  ;  *  \n
        x= re.split(',|; |\*|\n',a)
        print(x)   # ['Beautiful', ' is', 'better', 'than', 'ugly']
    
    # transf()
    
    # sort和sorted
    
    def sorted1():
        print sorted([36, 5, -12, 9, -21], key=abs) # [5, 9, -12, -21, 36]
    
        # 忽略大小写排序
        print sorted("This is a test string from Andrew".split(), key=str.lower)  # ['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']
        # 不忽略大小写,大写字母的ASCII码比小写的字母小,所以排在前面
        print sorted("This is a test string from Andrew".split())  # ['Andrew', 'This', 'a', 'from', 'is', 'string', 'test']
    
    
    #     反向排序,只需要传入第三个参数reverse=True
        print sorted("This is a test string from Andrew".split(), key=str.lower, reverse=True)  # ['This', 'test', 'string', 'is', 'from', 'Andrew', 'a']
    
    
    
    # list排序;list中包含元组的排序;
    def sorted2():
        from operator import itemgetter
    
        L = ['bob', 'about', 'Zoo', 'Credit']
    
        print(sorted(L))
        print(sorted(L, key=str.lower))
    
        students = [('Bob', 75), ('Adam', 88), ('Bart', 66), ('Lisa', 88)]
    
        # 按照第零个域排序
        print(sorted(students, key=itemgetter(0)))
        # 下面两种写法是等效的
        print(sorted(students, key=itemgetter(1)))
        print(sorted(students, key=lambda t: t[1]))
    
    
        print(sorted(students, key=itemgetter(1,0)))
        print(sorted(students, key=itemgetter(1,0), reverse=True))
    
    # sorted2()
    
    # 按照含有子串个数多少排序
    def sort3():
        from operator import methodcaller
        messages = ['critical!!!', 'hurry!', 'standby', 'immediate!!']
        print sorted(messages, key=methodcaller('count', '!'))   # ['standby', 'hurry!', 'immediate!!', 'critical!!!']
    
    
    # 按照升序和降序排序
    def sort4():
        student_tuples = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
        print sorted(student_tuples, key=lambda student: student[2])  #[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
        print sorted(student_tuples, key=lambda student: student[2],reverse=True) #[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
    ########################################################
    
    # python中数据类型的排序
    # 首先是字符串的排序
    
    def string_ordered1():
        str = 'i love python'
        print str[::-1],type(str[::-1])  # nohtyp evol i <type 'str'>
    
    
    def string_ordered2():
        s = 'i love python'
        l = list(s)
        l.sort()
        s = "".join(l)
        print s
    
    # 这种方法还没看太懂,先记录下
    def string_ordered3():
        s = "string"
    
        s = "".join((lambda x: (x.sort(), x)[1])(list(s)))
        print s
    
    
    
    # string_ordered2()
    
    
    
    
    
    
    
    # 冒泡排序
    def bubble(bubbleList):
        listLength = len(bubbleList)
        while listLength > 0:
            for i in range(listLength - 1):
                if bubbleList[i] > bubbleList[i + 1]:
                    bubbleList[i] = bubbleList[i] + bubbleList[i + 1]
                    bubbleList[i + 1] = bubbleList[i] - bubbleList[i + 1]
                    bubbleList[i] = bubbleList[i] - bubbleList[i + 1]
            listLength -= 1
        print(bubbleList)
    
    
    def bubble2(bubbleList):
        listLength = len(bubbleList)
        while listLength > 0:
            for i in range(listLength - 1):
                if bubbleList[i] > bubbleList[i + 1]:
                    tmp = bubbleList[i]
                    bubbleList[i]=bubbleList[i+1]
                    bubbleList[i+1]=tmp
    
                    # bubbleList[i] = bubbleList[i] + bubbleList[i + 1]
                    # bubbleList[i + 1] = bubbleList[i] - bubbleList[i + 1]
                    # bubbleList[i] = bubbleList[i] - bubbleList[i + 1]
            listLength -= 1
        print(bubbleList)
    
    # bubbleList = [2, 8, 4, 7, 5, 9, 0]
    # bubble(bubbleList)
    
    
    
    
    # 递归排序
    def recursion(n):
        if n == 1:
            return 1
        else:
            return n * recursion(n-1)
    
    print(recursion(10))
    
    
    
    
    
    
    # 将list中的每个数字转换成字符串,用map
    
    def f(x):
        return x*x
    
    def map1():
        r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
        print r  # [1, 4, 9, 16, 25, 36, 49, 64, 81]
    
    
    # 将list中的每个数字转换成字符串,用map
    def map2():
        r = map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])
        print r  # ['1', '2', '3', '4', '5', '6', '7', '8', '9']
    
    def map3():
        L1 = ['adam', 'LISA', 'barT']
        L2 = list(map(normalize, L1))
        print L2
    
    
    # map3()
    
    # reduce用法,将序列转换成整数
    def fn(x, y):
        return x * 10 + y
    
    
    def reduce1():
        # from functools import reduce
        r = reduce(fn, [3,6,8,9])
        print r,type(r)
    
    
    # reduce1()
    # print list([1,2,3])
    
    
    
    
    def zip1():
        a = [1, 2, 3]
        b = [4, 5, 6]
        print zip(a,b)  # [(1, 4), (2, 5), (3, 6)]
        c = (7,8,9)
        print zip(a,c)   # [(1, 7), (2, 8), (3, 9)]
    
    # 解压缩包
    def zip2():
        a = [1, 2, 3]
        b = [4, 5, 6]
        zipped = zip(a,b)
        print zip(*zipped)   # [(1, 2, 3), (4, 5, 6)]
    
    
    # zip2()
    
    
    
    
    
    
    
    # 去除list中的重复元素,且保持原来的顺序不变
    def remove_repeat1(list1):
    
        l2 = list(set(list1))
        print l2,type(l2)
        l2.sort(key=list1.index)
        return l2
    
    # 去除list中的重复元素,且保持原来的顺序不变
    def remove_repeat2(list1):
        l3 = []
        for i in list1:
            if i not in l3:
                l3.append(i)
        return l3
    
    
    # 去除list中的重复元素,且保持原来的顺序不变
    def remove_repeat3(list1):
        from collections import OrderedDict
        # d = OrderedDict.fromkeys(['a','b','c','a','b','c','c'])
        d = OrderedDict.fromkeys(list1)
        return list(d)
    
    
    # 去除list中的重复元素,顺序会变
    def remove_repeat4(list1):
        return list(set(list1))
    
    
    
    def remove_repeat5(list1):
        # a = [1,2,4,2,4,5,6,5,7,8,9,0]
        b = {}
        b=b.fromkeys(list1)
        c = b.keys()
        print c,type(c)
        c = sorted(c,key=list1.index)
        print c
    
    # remove_repeat5(list1)
    
    # 排序
    def sort1():
        students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
        print sorted(students, key=lambda student: student[2])
    
    # sort1()
    
    
    
    # 去除字符串中的空格
    def list_space():
        list1 = [' ','ff','','ss','aaa','']
        # for i in list1:
        #     # print i
        #     if i == ' ':
        #         # print 'yichang'
        #         list1.remove(i)
        #     #     print i,list1
        ls = [x for x in list1 if x.strip()]
        print ls
    
    # 将字符串倒序
    def string_reverse(m):
        num=len(m)
        a=[]
        for i in range(num):
                a.append(m[num-1-i])#从最后一位的元素开始往新list内添加元素
        return ''.join(a)
    
    
    
    
    # 字符串的练习
    
    # 字符串大小写转换方法
    def string1():
        s='fu junmin'
        print s.capitalize()  #Fu junmin,只对字符串的首字母大写
        print s   #fu junmin
        s = 'The quick brown fox jumped over the lazy dog.'
        print(string.capwords(s))    #The Quick Brown Fox Jumped Over The Lazy Dog.
    
    # string1()
    
    def count_find():
        s = 'I love python!'
        print s.count('o')  # 2
        print s.find('o')   # 3
    
        print s.count('9')   # 0
        print s.find('9')  # -1
    
        print s.count('o',5)  # 1
        print s.find('o',5)   # 11
    
        print s.count('o',5,7)  # 0
        print s.find('o',5,7)   # 11
    
    # count_find()
    
    
    # append和extend区别
    def append_extend():
        '''
        记住一点:append是追加,extend是对列表的扩展
        :return:
        '''
    
        list1 = [1,2]
        list1.append([3,4])
        print list1    # [1, 2, [3, 4]]
    
        list1.extend([5,6])   # [1, 2, [3, 4], 5, 6]
        print list1
    
        list1.append('love')  # [1, 2, [3, 4], 5, 6, 'love']
        print list1
    
        list1.extend('python')   # [1, 2, [3, 4], 5, 6, 'love', 'p', 'y', 't', 'h', 'o', 'n']
        print list1
    
    # append_extend()
    
    
    def alphabet_sorted():
        '''
        对一篇文章中的单词按照字母排序
        :return:
        '''
        str = 'I love python. If you love too , join us !'
        list1 = str.split()
        list1.sort()
        print list1
    
    # alphabet_sorted()
    
    # 字符串倒序
    def string_reverse():
    
        list2 = 'I love python'
    
        list3 = list2.split()
        list3.reverse()
        print list3    #['python', 'love', 'I']
    
        str4 = ' '.join(list3)
        print str4  # python love I
    
    
    
    '''
    # 列出目录下的所有文件
    '''
    def list_dir(dn,list_name):
        import os
        # dn=os.getcwd()
        # 获取当前目录,/Users/fujunmin/files/python/selfPractise/test
        L=os.listdir(dn)
        print L
        print '\n'.join(L)
        for i in L:
            file_path = os.path.join(dn,i)
            # print file_path
            if os.path.isdir(file_path):
                list_dir(file_path,list_name)
            else:
                list_name.append(file_path)
        # with open('result.txt','w') as wf:
        #     wf.write('\n'.join(L))
    
    
    # dn = '/Users/fujunmin/files/python/selfPractise/test/tmp'
    # list_name = []
    #
    # list_dir(dn,list_name)
    # print 'wenjian:',list_name
    
    
    
    # result = [name for name in os.listdir('.') if name.endswith(('.aa','.py'))]
    #
    # print os.getcwd()  # /Users/fujunmin/files/python/selfPractise/test
    # print result    # ['__init__.py', 'test1_basic.py']
    
    
    
    '''
    # 取出csv文件中多个字段值符合条件的
    
    '''
    def csv_test():
        # f = open('11.txt','r')
        with open('1.txt','r') as f1,open('2.txt', 'w') as f2:
            for line in f1.readlines(): # 'aaaaafds\n'
                a = line.strip()  # a: 'aaaaafds'
                a0 = a[0]
                # if a.startswith(['a-z','A-Z']):
                if a0.isalpha():
                    f2.write(a+'\n')
        f1.close()
        f2.close()
    
    #
    # def csv_test2():
    #     csvFile = open('11.txt','r')
    #     reader = csv.reader(csvFile)
    #
    #     for item in reader:
    #         print item
    
    
    # csv_test()
    
    
    '''
    # 删除字符串中多余字符
    
    '''
    def string_remove():
        str1 = ' abc     \n'
        print str1.strip()   # abc
    
        str2 = '----abcdf++++'
        print str2.strip('-+')  # abcdf
    
    # 删除字符串中多余字符
    def string_remove2():
        str1 = 'abc*wrt'   #删除字符串中的*
        print str1[:3]+str1[4:]   # abcwrt
    
    
    # 删除字符串中多余字符
    def string_remove3():
        str1 = '\nabc\nwrt22\n'   #删除字符串中的所有\n
        print str1.replace('\n','')   # abcwrt22
    
    
        str2 = '\nabc\nwrt22\t666\t'  # 删除字符串中的所有\n,\t
        import re
        print re.sub('[\n\t]','',str2)   # abcwrt22666
    
        str3 = 'abc123jm456n3fF'
        print re.sub(r'([\d]+)', '', str3) # abcjmnfF
        print re.sub(r'([\d]+)', '', str3).lower()  # abcjmnff
    
    
    # string有一个translate方法,第一个参数是映射的关系,第二个参数是删除操作
    def translate_pra():
        s = 'abc123456xyz'
        import string
    
        print s.translate(string.maketrans('abc','xyz'))  # xyz123456xyz
    
        s2 = 'abc\rdefff\nkl\t'
        print s2.translate(None,'\r\n\t')   # abcdefffkl
    
    # translate_pra()
    
    
    '''
    字符串拼接
    '''
    
    def string_add():
    
        str1 = 'abc'
        str2 = '456'
        print str1+str2  # abc456
    
        l1 = ['a1','a2','a3']
        s = ''
        for i in l1:
            s += i  # a1a2a3,但是这种方法会生成很多临时字符串,s分别和列表中的第一个、第二个...字符拼接,推荐使用str.join()方法
        print s
    
    def string_join():
    
        print ';'.join(['aa','bb','cc'])  # aa;bb;cc
        print ''.join(['aa','bb','cc'])  # aabbcc
    
        l1 = ['a1', 'a2', 'a3']
        print ''.join(l1) # a1a2a3,拼接列表中的每一个字符
    
        # 如果列表中含有数字
        l2 = ['a1',123,'b1',456]
        print ''.join([str(x)for x in l2]) #使用列表解析式, a1123b1456
    
        # 列表解析式有一个问题,如果列表过长的话,会很耗费时间,我们可以使用生成器表达式。存储的开销比列表小的多
        print ''.join(str(x)for x in l2)  # a1123b1456
    
    # string_join()
    
    
    
    '''
    string.endwith()用法
    '''
    
    
    
    
    
    
    
    
    
    # 判断一个字符串是不是对称字符串
    def symmetrical():
    
        str1 = "mnanm"
        list1 = list(str1)   #['m','n','a','n',m]
    
        list2 = list1
        list2.reverse()
        print list1
        print list2
        if list2 ==list1:
            print 'It is a symmetrical string'
    
    # symmetrical()
    
    
    
    # from urllib import urlretrieve
    #
    # urlretrieve('http://table.finance.yahoo.com/table.csv?s=000001.sz','pingan.csv')
    
    
    '''
    imooc--python进阶课程
    '''
    #
    from random import randint
    # data = [randint(-3,3) for _ in xrange(5)]
    # print data   # [0, 1, -1, -1, 2]
    #
    # print filter(lambda x:x>=0,data)  # [0, 1, 2],x接收的是data中的每一项,返回的是x>=0的项到最后的结果中
    
    #
    
    # d = {x:randint(60,100) for x in xrange(1,21)}  # 生成的d是一个字典,现在过滤出来值高于90的项
    #
    # print {k:v for k,v in d.items() if v>90}  # {1: 100, 3: 97, 6: 98, 9: 100, 12: 95, 13: 93, 17: 100, 18: 91}
    
    # data = [randint(-3,3) for _ in xrange(5)]
    # s = set(data)    # s: {0, 2, 3}
    #
    # print {x for x in s if x%3==0}
    
    
    
    
    def  calculate_count():
        from random import randint
        data = [randint(0,3) for _ in xrange(6)]
        print data  # [1, 3, 3, 2, 2, 1]
    
        c = dict.fromkeys(data,0)   # {0: 0, 1: 0, 2: 0, 3: 0}
    
        for x in data:
            c[x]+=1
        print c   # {1: 2, 2: 2, 3: 2}
    
        print {k:v for k,v in c.items() if v>90}
    
    def  calculate_count2():
        from collections import Counter
    
        data = [1,2,2,2,3,3,5,6,6,6,6]
        c = Counter(data)
        print c   # Counter({6: 4, 2: 3, 3: 2, 1: 1, 5: 1}),得到一个字典
        print c[6]  # 4
        print c.most_common(2)  # [(6, 4), (2, 3)],查找出现频度为前两个的
    
    
    def  calculate_count3():
        from collections import Counter
        content = open('2.txt','r').read()
        print content,type(content)  # i love python , and you? if you love it too? <type 'str'>
        import re
        c = Counter(re.split('\W+',content))
        print c  # Counter({'love': 2, 'you': 2, 'and': 1, '': 1, 'i': 1, 'it': 1, 'python': 1, 'too': 1, 'if': 1})
        num = c.most_common(1)
        print num  # [('love', 2)]
    
    # calculate_count3()
    

    相关文章

      网友评论

          本文标题:在列表、字典、集合中根据条件筛选数据

          本文链接:https://www.haomeiwen.com/subject/hdemlftx.html