zoukankan      html  css  js  c++  java
  • 理论上要每天写一点东西。

    1.数据结构和算法

    1.1 输出文本中匹配的内容的行以及前几行

    #!/usr/bin/env python
    
    from collections import deque
    
    
    def search(lines,pattern,history=5):
        previous_lines = deque(maxlen=history)
        for line in lines:
            if pattern in line:
                yield line,previous_lines
            previous_lines.append(line)
            
    if __name__ == '__main__':
        with open('55555.txt') as f:
            for line,previous_lines in search(f, 'python', 3):
                for pline in previous_lines:
                    print(pline,end='')
                print(line)
                print('-'*20)

    1.2取N个最大和最小值

    import heapq
    
    list1 = [1,-3,55,-44,0]
    print(heapq.nlargest(3, list1))
    print(heapq.nsmallest(3, list1))
    
    #当所要找的元素个数相对较小时,函数nlargest()和nsmallest()才是最合适的。
    #如果要找的元素个数与集合本身差不多大的话,通常更快的方法是先对集合排序再切片。(sorted(list1)[:N] or sorted(list1)[-N:])
    
    print(min(list1))
    print(max(list1))
    #如果只查询最大或者最小的一个值,还是用min()和max()更快。

    1.3 对字典的数据排序

    prices = {
              'a':123,
              'b':456,
              'd':559,
              'f':865
              }
    
    print(min(zip(prices.values(),prices.keys())))

    (123, 'a')
    #如果尝试在字典上执行常见的数据操作,将会发现它们只会处理键,而不是值。 #为了能对字典内容做些有用的计算,通常会利用zip()将字典的键和值反转过来。

    1.4 在两个字典间处理异同

    dict_a = {
              'x':1,
              'y':2,
              'z':3
              }
    dict_b = {
              'a':1,
              'b':2,
              'y':3
              }
    
    print(dict_a.keys() & dict_b.keys()) #a和b都有的键
    print(dict_a.keys() - dict_b.keys()) #去掉a中有b的键
    print(dict_a.items() - dict_b.items()) #去掉a中有b的键值的item。
    
    
    c = {key:dict_a[key] for key in dict_a.keys() - ['z','x']}
    print(c)
    
    #结果:
    {'y'}
    {'x', 'z'}
    {('z', 3), ('y', 2), ('x', 1)}
    {'y': 2}

    1.5 从序列中移除重复项且保持元素间顺序不变

    如果无需保证元素间顺序不变,可以a = [1,21,2,2,1,3,5],然后set(a)就可以去重。

    如果要保证元素间顺序不变,见下:

    a = [1,2,3,4,5,5,4,3,2,1]
    #序列中的元素必须是可哈希(在生存周期内不可变)的
    def deqeue(items):
        seen = set()
        for item in items:
            if item not in seen:
                yield item
                seen.add(item)
    print(list(deqeue(a)))
    
    #结果:
    [1, 2, 3, 4, 5]
    
    
    #如果序列中的元素是不可哈希的,就得用下面的代码了,
    a = [1,2,3,4,5,5,4,3,2,1]
    b = [{'x':1,'y':2},{'x':1,'y':3},{'x':2,'y':2},{'x':1,'y':3},{'x':4,'y':3},]
    
    def duqeue(items,key=None):
        seen = set()
        for item in items:
            val = item if key is None else key(item)
            if val not in seen:
                yield val
                seen.add(val)
                
    print(list(duqeue(a)))
    print(list(duqeue(b, key=lambda d:(d['x'],d['y']))))
    
    #结果:
    [1, 2, 3, 4, 5]
    [(1, 2), (1, 3), (2, 2), (4, 3)]

    1.12 找出序列中出现次数最多的元素

    from collections import Counter
    a = [1,2,3,4,5,5,4,3,2,1,1,1,1,2,3,3,4]
    
    counters = Counter(a)
    print(counters[4])
    print(counters[1])
    print(counters.most_common(3))
    
    #结果:
    3  #4出现了3次
    5  #1出现了5次
    [(1, 5), (3, 4), (2, 3)] #按出现次数从大到小前三位

     1.13 通过公共键对字典列表排序

    from operator import itemgetter
    
    rows = [
            {'fname':'Brian','lname':'fsaf','uid':432432},
            {'fname':'Zrian','lname':'ssaf','uid':132432},
            {'fname':'Crian','lname':'zsaf','uid':332432}        
            ]
    
    rows_by_fname = sorted(rows, key=itemgetter('fname'))
    rows_by_uid = sorted(rows, key=itemgetter('uid'))
    
    print(rows_by_fname)
    print(rows_by_uid)
    
    #结果:
    [{'uid': 432432, 'fname': 'Brian', 'lname': 'fsaf'}, {'uid': 332432, 'fname': 'Crian', 'lname': 'zsaf'}, {'uid': 132432, 'fname': 'Zrian', 'lname': 'ssaf'}]    #按fname的开始字母排序的
    [{'uid': 132432, 'fname': 'Zrian', 'lname': 'ssaf'}, {'uid': 332432, 'fname': 'Crian', 'lname': 'zsaf'}, {'uid': 432432, 'fname': 'Brian', 'lname': 'fsaf'}]    #按uid的大小排序的

    rows_by_fname_lambda = sorted(rows, key = lambda r:r['fname'])
    rows_by_uid_lambda = sorted(rows, key = lambda r:(r['uid'],r['fname'])) ,利用lambda也能实现,只是效率不如用itemgetter高。

    1.14 对不原生支持比较操作的对象排序

    class User:
        def __init__(self,user_id):
            self.user_id = user_id
        def __repr__(self):
            return 'User({})'.format(self.user_id)
    
    u = [User(17),User(27),User(3)]
    print(sorted(u,key = lambda u:u.user_id))
    
    #结果:
    [User(3), User(17), User(27)]

    直接排序User(17),User(27),User(3)是会报错的。

    1.16 筛选序列中的元素

    a = [1,-1,2,0,33,4,-22]
    print([n for n in a if n > 0])
    #这样可以做到,但是如果原始数据非常大的话,这么做可能会产生一个庞大的结果。如果这是你需要考虑的问题,那么可以使用生成器表达式通过迭代的方式产生筛选的结果。
    
    pos = [n for n in a if n > 0]
    for x in pos:
        print(x)
    
    有时候以为生成器的语法太简单而不足以满足需求,可以自定义一个筛选函数,然后结合filter筛选,
    b = [1,-1,2,0,33,4,-22,'fdsaf']
    def val_filter(num):
        try:
            x = int(num)
            return True
        except ValueError:
            return False
    
    ivals = list(filter(val_filter,b))
    print(ivals)
  • 相关阅读:
    rpm yum 等命令无响应的解决方法
    ulimit open files linux打开文件数设置验证
    解析XtraBackup备份MySQL的原理和过程(转)
    Xtrabackup之innobackupex备份恢复详解(转)
    Linux中内存查看命令free详解(转)
    mysql innobackupex xtrabackup 大数据量 备份 还原(转)
    Percona Xtrabackup备份mysql(转)
    安装完 MySQL 后必须调整的 10 项配置(转)
    MySQL 5.5 服务器变量详解二(转)
    MySQL 5.5 服务器变量详解一(转)
  • 原文地址:https://www.cnblogs.com/fuckily/p/5949911.html
Copyright © 2011-2022 走看看