Python 进阶(上)

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

列表

方法一:filter 函数
In [1]: from random import randint
In [2]: data = [randint(-10,10) for _ in xrange(10)]
In [3]: data
Out[3]: [5, 3, -5, -10, -3, 0, 2, 1, 8, 8]
In [4]: filter( lambda x:x>0,data)
Out[4]: [5, 3, 2, 1, 8, 8]
方法二:列表解析
In [5]: [x for x in data if x>0]
Out[5]: [5, 3, 2, 1, 8, 8]
In [6]: timeit filter(lambda x:x>0,data)# 两个方法运行时间对比:
The slowest run took 11.86 times longer than the fastest. This could mean that an intermediate result is being cached.
1000000 loops, best of 3: 1.62 µs per loop
In [7]: timeit [x for x in data if x>0]
1000000 loops, best of 3: 747 ns per loop
tips:可以看出,列表解析的速度更快,用时为 filter 函数的一半,当然,这两种方法都快于传统的 for 循环方法。

字典

方法:字典解析
In [8]: d = {x:randint(60,100) for x in xrange(1,21)} # 随机生成20个字典
In [9]: {k:v for k,v in d.iteritems() if v>90}
Out[9]: {7: 92, 12: 97}

集合

方法:集合解析
In [13]: s = set([randint(-10,10) for _ in xrange(10)])
In [20]: s
Out[20]: {-8, -7, -6, -1, 1, 2, 3, 8, 10}
In [21]: {x for x in s if x%3==0}
Out[21]: {-6, 3}

2、如何为元组中的每个元素命名,提高程序可读性?

方法一:使用 namedtuple
In [28]:  from collections import namedtuple
In [30]: Person = namedtuple('Person',['name','age','sex','email'])
In [31]: person = Person('Saders','18','male','123456@mail.com')
In [32]: person.name,person.age,person.sex,person.email
Out[32]: ('Saders', '18', 'male', '123456@mail.com')

3、如何统计序列中元素的出现频度?

方法一:for 循环
data = [randint(0,20) for _ in xrange(30)] # 随机生成30个数
c = dict.fromkeys(data,0) # 以0为初始值创建字典
In [37]: c   
Out[37]: {0: 0, 1: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 10: 0, 11: 0, 12: 0, 15: 0, 16: 0, 17: 0, 19: 0, 20: 0}
In [38]: for x in data:   # for 循环统计
    ...:     c[x] += 1
In [39]: c
Out[39]:{0: 3, 1: 2, 3: 2, 4: 2, 5: 1, 6: 4, 7: 1, 10: 2, 11: 4, 12: 2, 15: 2, 16: 1, 17: 1, 19: 2, 20: 1}
方法二:使用 Counter 
In [40]: from collections import Counter 
In [41]: c = Counter(data)
In [42]: c                               
Out[42]: Counter({0: 3, 1: 2, 3: 2, 4: 2, 5: 1, 6: 4, 7: 1, 10: 2, 11: 4, 12: 2, 15: 2, 16: 1, 17: 1, 19: 2, 20: 1})
In [43]: c.most_common(3)  # 出现频率最高的前3位         
Out[43]: [(6, 4), (11, 4), (0, 3)]       

4、如何根据字典值的大小,对字典中的项排序?

方法一:zip 函数与 sorted 函数结合
In [49]: data={x:randint(60,100) for x in 'abcdef'}
In [51]: sorted(zip(data.values(),data.keys())) # 由小到大排名
Out[51]: [(71, 'e'), (73, 'b'), (75, 'a'), (79, 'c'), (79, 'f'), (90, 'd')]
方法二:传递 sorted 函数的 key 参数
In [52]: sorted(data.items(), key=lambda x:x[1])
Out[52]: [('e', 71), ('b', 73), ('a', 75), ('c', 79), ('f', 79), ('d', 90)]

5、如何快速找到多个字典中的公共键?

方法一:for 循环
In [54]: from random import randint,sample
In [55]: r1 = {x:randint(1,4) for x in  sample('qwertyu',randint(3,6))}  # 生成数据
In [56]: r2 = {x:randint(1,4) for x in sample('qwertyu',randint(3,6))} 
In [57]: r3 = {x:randint(1,4) for x in sample('qwertyu',randint(3,6))} 
In [58]: r1
Out[58]: {'e': 3, 'q': 1, 'r': 2, 't': 4, 'u': 3, 'y': 2}
In [59]: r2
Out[59]: {'q': 3, 'r': 4, 't': 4, 'y': 4}
In [60]: r3
Out[60]: {'e': 4, 'q': 1, 'r': 1, 'u': 2, 'w': 2, 'y': 2}
In [61]: res = []
In [62]: for k in r1:    # 判断三轮都出现的键
    ...:     if k in r2 and k in r3:
    ...:         res.append(k)
In [63]: res
Out[63]: ['q', 'r', 'y']
方法二:set 的交集操作
In [65]: r1.viewkeys() & r2.viewkeys() & r3.viewkeys()
Out[65]: {'q', 'r', 'y'}
方法三:map 函数与 reduce 函数
In [67]: reduce(lambda a,b:a&b,map(dict.viewkeys,[r1,r2,r3]))
Out[67]: {'q', 'r', 'y'}

6、如何让字典保持有序?

方法:使用 OrderedDict
In [68]: from collections import OrderedDict
In [69]: d = OrderedDict()
In [70]: d['jim'] = (1,20)
In [71]: d['bob'] = (2,30)
In [72]: d['john'] = (3,40)
In [73]: d
Out[73]: OrderedDict([('jim', (1, 20)), ('bob', (2, 30)), ('john', (3, 40))])

7、如何实现用户的历史记录功能?

方法:使用 deque
In [74]: from collections import deque
In [75]: q = deque([],5)
In [77]: q.append(1)
In [78]: q.append(2)
In [79]: q.append(3)
In [78]: q.append(4)
In [79]: q.append(5)
In [83]: q
Out[83]: deque([1, 2, 3, 4, 5])
In [82]: q.append(6)
In [83]: q
Out[83]: deque([2, 3, 4, 5, 6])

8、如何对迭代器做切片操作?

方法:使用 islice
In [91]: from itertools import islice
In [86]: l = range(15) # 生成 1-20 的数
In [87]: l
Out[87]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
In [88]: i = iter(l)   # 生成迭代器
In [89]: i
Out[89]: <listiterator at 0x426b7b0>
In [91]: from itertools import islice
In [92]: for j in islice(i, 5, 10):  # 将迭代器切片
    ...:     print j                                          
5                                    
6                                    
7                                    
8                                    
9
tips:值得注意的是,这个切片操作是会消耗 i 这个迭代器的,每次用完 islice 方法,都要重新申请。
In [93]: for k in i:                 
    ...:     print k
10                                   
11                                   
12                                   
13                                   
14

9、如何拆分含有多种分隔符的字符串?

方法一:使用 str.split
In [102]: def mspilt(s,ds):
     ...:     res = [s]
     ...:     for d in ds:
     ...:         t=[]
     ...:         map(lambda x:t.extend(x.split(d)),res)
     ...:         res = t
     ...:     return res
In [103]: s = 'gfd;sdfew|asdfs,ewfsc\tsdf;asd? asd a'
In [107]: print mspilt(s, ',;|\t?')
['gfd', 'sdfew', 'asdfs', 'ewfsc', 'sdf', 'asd', ' asd a']
方法二:使用 re.split
In [108]: import re
In [110]: re.split(r'[,;?|\t]+',s)
Out[110]: ['gfd', 'sdfew', 'asdfs', 'ewfsc', 'sdf', 'asd', ' asd a']
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351

推荐阅读更多精彩内容