Python高效编程实战---1、数据结构与算法进阶

一、在list\dict\set中进行筛选

  1. 在list中筛选:
    方法一:[x for x in list if x>10] # 效率更高
    方法二:filter(lambda x :x>10,list) # lambda 定义一个匿名函数

  2. 在dict中筛选:
    {k: v for k, v in dict.items() if v > 85} # 后面添加条件

  3. 在set中筛选:
    {s for s in set if s>10}
    # set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
    # 语法:class set([iterable])

二、为元组中每个元素命名,提高可读性

方法一:宏定义方法

student = ('litaifa','40','male')
NAME, AGE, SEX = xrange(3)
print student[NAME]

方法二:命名元组方法 namedtuple
collections.namedtuple(typename, field_names, verbose=False, rename=False)
返回一个命名元祖子类typename,其中参数的意义如下:

typename,:此元组的名称; field_names:
元祖中元素的名称(类似于c结构体中的age等),此字段有多种表达方式,见例子;
rename:如果元素名称中含有python的关键字,则必须设置为rename=True,具体见下面; verbose:默认就好;

实例:

import collections
#其中field_names 有多种表达方式,如下
student=collections.namedtuple('student','name age sex')   # 三种方法,选其中一种
student=cpllections.namedtuple('student',['name','age','sex'])
student=cpllections.namedtuple('student','name,age,sex')

spark=student(name='sunYang',age=20,sex='male')
print(spark)    # student(name='sunYang', age=20, sex='male')
print("spark's name is %s" % spark.name)   # spark's name is sunYang
print("%s is %d years old %s" % spark)  # sunYang is 20 years old male

三、dict\list排序

list排序:

x=[1,3,5,7,10,5,3]
方法一
x.sort(lambda a, b: a - b) # 可以自定义,此例表示按升序排列
方法二
x.sort() # 系统自带的排序规则,也可以,x.sort(reverse=True) 倒序排序,sort会改变列表的排序,如果要新生成列表,可以用sorted方法

dict按值排序

d={‘name’+str(k):randint(60,100) for k in xrange(1,6)}
方法一:
sort = sorted(d.items(),key=lambda e:e[1]) # 按值排序
方法二:
dic_tup=zip(dic.itervalues(),dic.iterkeys()) # zip方法是将两人列表拼成一个元组列表

sorted(dic_tup,reverse=True) # 对于元组的排序规则是,先按照第一个值排序,然后再依次往后

四、统计序列中元素出现的频度

from collections import Counter
import re
f=open('django.txt')   # 打开文件
txt=f.read()
f.close()
txt_list = re.split(r'\W+',txt)  # 将文本转化为列表,以非文字字符作为分隔符
print Counter(txt_list).most_common(10)   # 统计列中元素出现的频度,并返回频度最高的前10个单词

五、快速找到多个字典中的公共键

from random import randint, sample
baller = 'abcdefg'  # 假设有7名球员
dic1 = {b: randint(1, 4) for b in sample(baller, randint(4, 6))}  # 随机生成一场球进球环员及进环数
dic2 = {b: randint(1, 4) for b in sample(baller, randint(4, 6))}
dic3 = {b: randint(1, 4) for b in sample(baller, randint(4, 6))}

方法一:循环判断

list = []
for k in dic1:
    if k in dic2 and k in dic3:
        list.append(k)

方法二:

  1. 用字典viewkeys()方法,得到字典keys的集合
  2. 使用map函数得到所有字典keys的集合
  3. 使用reduce取得所有keys的交集
m = map(dict.viewkeys, [dic1, dic2, dic3])
r = reduce(lambda x, y: x & y, m)

六、让字典保持有序

from time import time
from random import randint
from collections import OrderedDict

stu = list('ABCDEFGH')  # 定义A B...8个学生的列表
l = len(stu)
start = time()   # 记录开始时间
dic = OrderedDict()   # 定义一个排序字典,顺序接添加顺序排列
for i in xrange(0, l):
    raw_input()                    # 阻塞函数,等待用户输入
    p = stu.pop(randint(0, l - i-1))  # 随机移除列表中元素,并返回该元素
    end = time()
    print p, i + 1, end - start,  # print 后面为逗号,表示打印后,不换行
    dic[p]=(i+1,end-start)  # 对排序字典进行赋值
print
print '-'*20   # 表示重复打印20个'-'

for k in dic:
    print k,dic[k]  

七、实现用户的历史记录功能(最多n条)

from random import randint
from collections import deque
import pickle

# 猜数字游戏
def guest(t, n):  # 判断数字是否准确
    if t == n:
        print "you are correct"
        return True
    if t < n:
        print "your digital is litter"
    else:
        print "your digital is bigger"
    return False

if __name__ == "__main__":
    n = randint(0, 100)
    p = deque([], 5)  # deque是一个双端循环队列,队列的长度为5
    while False:
        dig = raw_input("please input digital :  ")
        if dig.isdigit():
            dig = int(dig)
            p.append(dig)  # 将数字添加到队列,当队列中多于5个时,最先添加的将被挤出
            if guest(dig, n):
                f = open('digital', 'w')
                pickle.dump(p, f)    # 将python对象写入到文件中
                f.close()
                break
        elif dig == 'exit':
            break
        elif dig == 'h':
            print list(p)  # 打印队列

    f = open('digital', 'r')   # 打开文件
    p = pickle.load(f)   # 从文件中读取python对象
    f.close()
    print list(p)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章