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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章