Python技巧:List,Tuple,Dict,Set

Welcome To My Blog
自己最近主要是用Python,还不是很扎实,学习了程序员硕的Python高效编程技巧实战,讲得很好,感觉受益匪浅,故分享一下心得

一.在列表List,字典Dict,集合Set中根据条件筛选数据

使用各自的生成式即可
产生相同的列表,列表表达式速度比过滤函数快!!将近一倍. 这两种方法都远远快于for循环
过滤函数定义: filter(function or None, sequence) -> list, tuple, or string

21.jpg

二.为每个元组Tuple中的元素命名,提高程序可读性

  1. 定义类似于其它语言的枚举类型,也就是定义一系列数值常量
NAME = 0  
AGE = 1  
EMAL = 2  

或者

NAME,AGE,EMAIL = range(3)  

具体使用

s1 = ('haes',16,'5065@qq.com')
print s1[AGE]    

这么使用得提前设计好数据结构

  1. 使用collections.namedtuple替代内置tuple
    先实例化一个namedtuple对象,这个对象和tuple的地位一样,只不过带名字(名字就是这个对象的各个属性)
from collections import namedtuple  
student = namedtuple('s1',['NAME','AGE','EMAIL'])  
s = student('haes',16,'5065@qq.com')  
print s.NAME  
print isinstance(s,tuple) #Ture

三.统计序列sequence中元素的出现次数

  1. 使用sorted函数
#比如:按字典的值排序
new_c = sorted(c.items(),key=lambda x :x[1])
  1. 使用collections.Counter对象
    将序列sequence传入Counter的构造函数,得到Counter对象是元素出现次数的字典
    Counter.most_common(n)方法得到出现次数最多的前n个元素的列表
from collections import Counter
new_c = Counter(data)
print new_c[3] #data中索引为2的元素出现的次数
print new_c.most_common(4) #[(10, 4)说明10出现了4次

四.根据字典值的大小,对字典的项排序

  1. 使用sorted函数
from random import randint
d = {x:randint(60,100) for x in 'xyzabc' }
#直接排序是对字典的键排序,因为默认是对各项的第一个元素排序,元组也是
print sorted(d )
#<dictionary-keyiterator object at 0x00000000066742C8>
print iter(d)
#可以通过list看看具体的迭代对象是什么
print list(iter(d))

#使用sorted函数的key参数
b = {x:randint(60,100) for x in range(10)}
#根据value排序和对value排序是两个不同的概念!!!!
new_b1 = sorted(b.items(),key=lambda x:x[1])
new_b2 = sorted(b.values())
new_b3 = sorted(b)
print new_b1
print new_b2
print new_b3
  1. 使用zip函数将字典数据转化元组
    根据value排序和对value排序是两个不同的概念
    zip(seq1, seq2, *more_seqs) 返回的是元组
#zip的使用
new_d = zip(d.values(),d.keys())
#使用迭代版本的key和value节约空间!!!!
new_D = zip(d.itervalues(),d.iterkeys())
print new_D
#将value放在第一个位置,这样就可以按照value排序了
print sorted(new_D)

五.查找多个字典的公共键

step1. 使用字典的viewkeys()方法,得到一个字典keys的集合set
step2. 使用map函数,得到所有字典的keys的集合
step3. 使用reduce函数,得到所有字典的集合的交集set

from random import randint,sample
#先随机生成4个字典
#def sample(self, population, k):
#Chooses k unique random elements from a population sequence.
#sample:从population序列里面随机选取k个
print sample('abcdefg',randint(3,6))
s1 = {k:randint(0,5) for k in sample('abcdefg',randint(3,6)) }
s2 = {k:randint(0,5) for k in sample('abcdefg',randint(3,6)) }
s3 = {k:randint(0,5) for k in sample('abcdefg',randint(3,6)) }
s4 = {k:randint(0,5) for k in sample('abcdef',randint(3,6))}

# print s1.viewkeys() & s2.viewkeys() & s3.viewkeys()
#map对每个元素执行相同的操作
s = map(dict.viewkeys,[s1,s2,s3])
#def reduce(function, sequence, initial=None)
print reduce(lambda a,b:a & b,s)

#用lambda也行
# s = map(lambda x : x.viewkeys(),[s1,s2,s3])
# print reduce(lambda a,b:a & b,s)

六.让字典保持有序

使用collections中的有序字典OrderedDict

#实例化一个OrderedDict对象,然后赋值即可
#先插入的值排在前面
from collections import OrderedDict
d = OrderedDict()
d['Bob'] = 1
d['Jim'] = 21
d['Leo'] = -100
for k in d: 
    print k
#模拟跑步排名,先记录的说明成绩靠前
from time import time
from random import randint
from collections import OrderedDict
players = list('ABCDEFGH')
start = time()
d = OrderedDict()
for i in range(8):
    raw_input()
    #pop还能这么用
    p = players.pop(randint(0,7-i))
    end = time()
    print i+1,p,end-start
    d[p] = (i+1,end-start)
print "------------------------------------------"
for k in d: print k,d[k]

七.实现用户的历史记录功能

使用collections中的deque,它是一个双端循环队列
程序退出前可以使用pickle将队列对象存入文件,再次运行程序时将其导入

from collections import deque
# deque 双端队列
#def __init__(self, iterable=(), maxlen=None)
#最多存5条,超过5条会把最开始的删掉,从而保持deque的容量为5
q = deque([],5)
q.append(1)
q.append(2)
q.append(3)
q.append(4)
q.append(5)
q.append(6)
print q
#模拟猜数
from random import randint
from collections import deque
import pickle

N = randint(0,100)
history = deque([],5)
def guess(k):
    if k==N:
        print 'right'
        return True
    if k<N:
        print '%s is less than N'%k
        return False
    else:
        print '%s is greater than N'%k
        return False

while(True):
    line = raw_input('plz input a number: ')
    if line.isdigit():
        k = int(line)
        history.append(k)
        if guess(k):
            break;
    elif line == 'check':
        print list(history)

pickle.dump(history,open('test.txt','wb'))
p = pickle.load(open('test.txt','rb'))
print p
print list(p)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,776评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,527评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,361评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,430评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,511评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,544评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,561评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,315评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,763评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,070评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,235评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,911评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,554评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,173评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,424评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,106评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,103评论 2 352

推荐阅读更多精彩内容

  • 〇、前言 本文共108张图,流量党请慎重! 历时1个半月,我把自己学习Python基础知识的框架详细梳理了一遍。 ...
    Raxxie阅读 18,942评论 17 410
  • http://python.jobbole.com/85231/ 关于专业技能写完项目接着写写一名3年工作经验的J...
    燕京博士阅读 7,566评论 1 118
  • 黑: 漫漫长夜 思绪乱窜 黑色白色 谁占上风 白: 热烈明朗 思绪清新 红色蓝色 混杂其中...
    野水横木阅读 238评论 0 1