20.8.1. 实用技巧进阶一

如何在列表中根据条件筛选数据

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/8/17 22:34
# filename: 1.如何在列表中根据条件筛选数据.py

data = [-1, 2, 3, -4, 5]

# 方式1
new_data = []
for i in data:
    if i > 0:
        new_data.append(i)
print(new_data)     #[2, 3, 5]

# 方式2,列表推导式
new_data2 = [i for i in data if i > 0]
print(new_data2)    #[2, 3, 5]

# 方式3,filter函数
new_data3 = list(filter(lambda i: i > 0, data))
print(new_data3)    #[2, 3, 5]

如何在字典中根据条件筛选数据

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/8/17 22:49
# filename: 02.如何在字典中根据条件筛选数据.py

from random import randint

# 生成字典
d = {'student%d' % i: randint(100, 200) for i in range(1, 21)}
print(d)

# 方法1
d1 = {k: v for k, v in d.items() if v > 150}
print(d1)
#{'student15': 185, 'student1': 171, 'student7': 192, 'student19': 191, 'student2': 158, 'student16': 152, 'student13': 168, 'student9': 173}

# 方法2
d2 = dict(filter(lambda item: item[1] > 150, d.items()))
print(d2)
#{'student15': 185, 'student1': 171, 'student7': 192, 'student19': 191, 'student2': 158, 'student16': 152, 'student13': 168, 'student9': 173}

如何在集合中根据条件筛选数据

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/8/18 11:20
# filename: 03.如何在集合中根据条件筛选数据.py
from random import randint

s = {randint(0, 20) for _ in range(20)}
print(s)

hu1 = {x for x in s if x % 3 == 0}
print(hu1)

如何为元祖中的每个元素命名,提高程序可读性

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/8/18 11:23
# filename: 04.如何为元祖中的每个元素命名,提高程序可读性.py

def func(student):
    if student[1] < 18:
        pass

    if student[2] == 'male':
        pass


s1 = ('derek', 22, 'male', '111@qq.com')

# 第一种:使用枚举
from enum import IntEnum


class StudentEnum(IntEnum):
    NAME = 0
    AGE = 1
    SEX = 2
    EMAIL = 3


print(s1[StudentEnum.NAME])
print(s1[StudentEnum.AGE])
print(s1[StudentEnum.SEX])
print(s1[StudentEnum.EMAIL])

print("*" * 50,"使用collections.namedtuple来实现", "*" * 50)
# 第二种:使用标准库中collections.namedtuple替代内置tuple
from collections import namedtuple

Student = namedtuple('student', ['name', 'age', 'sex', 'email'])
s2 = Student('derek', 22, 'male', '222@qq.com')
print(s2[0])  # derek
# 可以通过s2.name获取姓名
print(s2.name)  # derek

如何根据字典中值的大小,对字典中的项进行排序

#!/usr/bin/env python
#-*- coding:utf8 -*-
# auther; 18793
# Date:2019/8/18 11:26
# filename: 05.如何根据字典中值的大小,对字典中的项进行排序.py

# 1.5.如何根据字典中值的大小,对字典中的项进行排序

from random import randint

d = {k: randint(60, 100) for k in 'abcdefg'}
print(d)
#第一种方法:使用列表解析或者zip()函数,把字典的keys和values反转过来
list1 = [(v,k) for k,v in d.items()]
#或者使用zip()函数
# list2 = list(zip(d.values(),d.keys()))
print(list1)
list1 = sorted(list1,reverse=True)
print(list1)

如何根据字典中值的大小,对字典中的项进行排序

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/8/18 11:33
# filename: 06.如何根据字典中值的大小,对字典中的项进行排序.py

# 方式1

from random import randint

d = {k: randint(60, 100) for k in 'abcdefg'}
print(d)
# 第一种方法:使用列表解析或者zip()函数,把字典的keys和values反转过来
list1 = [(v, k) for k, v in d.items()]
# 或者使用zip()函数
# list2 = list(zip(d.values(),d.keys()))
print(list1)
list1 = sorted(list1, reverse=True)
print(list1)

# 方式2 使用sorted排序
p = sorted(d.items(), key=lambda item: item[1], reverse=True)
print(p)

# 对分数添加一个排名
d = {k: (i, v) for i, (k, v) in enumerate(p, 1)}
print(d)

如何统计序列中元素的频度

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/8/18 11:37
# filename: 07.如何统计序列中元素的频度.py

# 1.6如何统计序列中元素的频度
from random import randint
from collections import Counter

data = [randint(1, 5) for _ in range(1, 20)]
print(data)  # [5, 2, 1, 2, 5, 3, 1, 1, 1, 4, 2, 5, 3, 2, 3, 5, 1, 2, 5]

# 计算频度最高的是三个数
c = Counter(data)
print(c.most_common(3))  # [(1, 5), (3, 4), (2, 4)]

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

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/8/18 11:37
# filename: 08.如何快速找到多个字典中的公共键.py
from random import randint, sample
from functools import reduce

d1 = {k: randint(1, 4) for k in sample('abcdefgh', randint(3, 6))}
d2 = {k: randint(1, 4) for k in sample('abcdefgh', randint(3, 6))}
d3 = {k: randint(1, 4) for k in sample('abcdefgh', randint(3, 6))}

# 1.使用字典的keys()方法,得到一个字典keys的集合
# 2.使用map函数,得到每个字典keys的集合
# 3.使用reduce,取所有字典keys集合的交集

dl = [d1, d2, d3]
# 找到三个字典中相同的keys
result = reduce(lambda a, b: a & b, map(dict.keys, dl))
print(result)

如何让字典保持有序

#!/usr/bin/env python
# -*- coding:utf8 -*-
# auther; 18793
# Date:2019/8/18 11:39
# filename: 09.如何让字典保持有序.py

from collections import OrderedDict
from itertools import islice

d = OrderedDict()
d['e'] = 5
d['d'] = 4
d['c'] = 3
d['b'] = 2
d['a'] = 1

print(d)  # OrderedDict([('e', 5), ('d', 4), ('c', 3), ('b', 2), ('a', 1)])


# OrderedDict字典,在迭代操作时,它会保持元素被插入时的顺序

def query_by_order(d, a, b=None):
    if b is None:
        b = a + 1
    return list(islice(d, a, b))


# 第五个key
res1 = query_by_order(d, 4)
print(res1)  # ['a']

# 第二个和第三个key
res2 = query_by_order(d, 1, 3)
print(res2)  # ['d', 'c']

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

#!/usr/bin/env python
#-*- coding:utf8 -*-
# auther; 18793
# Date:2019/8/18 11:41
# filename: 10.如何实现用户的历史记录功能.py

"""
使用容量为n的队列存储历史记录

使用deque双端循环队列存储历史记录(deque是保存到内存中,下次启动历史记录会消失)
如果想保存到硬盘中,使用pickle模块,以便下次启动使用
"""

from random import randint
from collections import deque
import pickle


def guess(n, k):
    if n == k:
        print('猜对了,这个数字是%d' % k)
        return True
    if n < k:
        print('猜大了,比%d小' % k)
    elif n > k:
        print('猜小了,比%d大' % k)
    return False


def main():
    n = randint(1, 100)
    i = 1
    hq = deque([], 5)
    while True:
        line = input('[%d]请输入一个数字:' % i)
        if line.isdigit():
            k = int(line)
            hq.append(k)
            i += 1
            if guess(n, k):
                break
        elif line == 'quit':
            break
        elif line == 'history':
            print(hq)


if __name__ == '__main__':
    main()