Python字典和集合编程技巧分享

本文主要给大家介绍了关于Python字典和集合编程技巧的相关资料,Python中的字典和集合是两种非常常用的数据结构,它们可以帮助我们更方便地管理和操作数据,需要的朋友可以参考下

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

实际案例

  • 案例1:过滤掉列表[3, 9, -1, 10, 20, -2, …] 中的负数
  • 案例2:筛出字典{‘lisi’: 79, ‘Jin’: 88, ‘lucy’: 93, … }中值高于90的项
  • 案例3:筛出集合{77, 89, 34, 20, 21…}中能被3整除的元素
    这类问题比较简单,通常的做法就是依次迭代列表、字典、集合中的每个项,进行条件判断。

但是在python中,还有更高级的方法来解决这类问题,并且更简单高效。

01 案例1:过滤掉列表[3, 9, -1, 10, 20, -2, …] 中的负数

方法一:使用 filter 函数

1

2

3

4

5

6

7

8

from random import randint

# 使用列表解析生成 -10~10 之间的10个元素

data = [randint(-10, 10) for _ in range(10)]

print('原始列表为:' , data)

# filter(function or None, iterable) --> filter object

data_o = filter(lambda x: x >= 0, data)

for each in data_o:

    print(each)

方法二:使用列表解析

1

2

3

4

5

6

from random import randint

# 使用列表解析生成 -10~10 之间的10个元素

data = [randint(-10, 10) for _ in range(10)]

print('原始列表为:',  data)

data_o = [x for x in data if x >= 0]

print(data_o)

02 案例2:筛出字典{‘lisi’: 79, ‘Jin’: 88, ‘lucy’: 93, … }中值高于90的项

1

2

3

4

5

6

from random import randint

# 使用字典解析生成 一个字典

d ={x: randint(60, 100) for x in range(1, 10)}

print(d)

d_o = {k: v for k, v in d.items() if v >= 90}

print(d_o)

03 案例3:筛出集合{77, 89, 34, 20, 21…}中能被3整除的元素

1

2

3

4

5

6

from random import randint

# 使用集合解析生成 -10~10 之间的10个元素

data = {randint(-10, 10) for _ in range(10)}

print('原始集合为:', data)

data_o = {x for x in data if x % 3 == 0}

print(data_o)

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

1

2

3

4

5

6

stuents = ('Jim', 16, 'male', 'jim8721@qq.com')

name=stuents[0]

age=stuents[1]

sex= stuents[2]

email=stuents[3]

print(name, age, sex, email)

01 方法一:定义类似与其他语言的枚举类型,也就是定义一系列数值常量

1

2

3

4

5

6

7

s=stuents = ('Jim', 16, 'male', 'jim8721@qq.com')

NAME, AGE, SEX, EMAIL = range(4)

name=s[NAME]

age=s[AGE]

sex= s[SEX]

email=s[EMAIL]

print(name, age, sex, email)

02 方法二:使用标准库中 collections.nameedtuple 替代内置 tuple

1

2

3

4

5

6

7

8

9

10

11

12

13

from collections import namedtuple

Student = namedtuple('Student', ['name', 'age', 'sex', 'email'])

s = Student('Jim', 16, 'male', 'jim182@qq.com')

print(s)

# Student(name='Jim', age=16, sex='male', email='jim182@qq.com')

print(s.name)

# 'Jim'

print(s.age)

# 16

print(s.sex)

# 'male'

print(s.email)

# 'jim182@qq.com'

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

案例1:

方法一:传统方法

1

2

3

4

5

6

7

8

9

from random import randint

# 随机生成一个列表

data = [randint(0, 20) for _ in range(30)]

# 以列表中的值为字典的键,0为字典的值建立字典

c = dict.fromkeys(data, 0)

# 依次遍历列表,遇到一个元素,就把字典中对应的键的值加1

for x in data:

    c[x] += 1

print(c)

方法二:使用 collections.Counter 对象

将序列传入 Counter 的构造器,得到 Counter 对象是元素频率的字典

Counter.most_common(n) 方法得到频率最高的 n 个元素的列表

1

2

3

4

5

6

7

8

9

10

from random import randint

from collections import Counter

# 随机生成一个列表

data = [randint(0, 20) for _ in range(30)]

c = Counter(data)

# 得到的 c 就是一个collections.Counter类型的数据,和方法 一 结果一样

# 用法与字典一样,例如 c[2] , 就是得到 键为2 对应的值

print(c)

# 另外,还可以使用 most_common() 方法得到 出现频率最高的几个键和值

print(c.most_common(3))  # 输出前3名

案例2:

1

2

3

4

5

6

7

8

9

from collections import Counter

import re

with open('./test.txt', 'r') as f:

    txt = f.read()

# 使用 正则表达式 对文本进行切割,按照 非字母字符 进行切割

l1 = re.split('\W+', txt)

c = Counter(l1)

# 得到频率最高的10个单词

print(c.most_common(10))

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

01 方法一:使用zip将字典数据转换为元组

1

2

3

4

5

6

7

8

9

from random import randint

# 生成随机字典

d = {x:randint(60,100) for x in 'xyzabc'}

print(d)

# 把值放在前面,键放在后面,构成元组,每个元组为列表的一个项

# 得到的结果为 [(74, 'z'), (80, 'y')...]形式

list1 = zip(d.values(), d.keys())

# 然后对得到的列表进行排序,就会以列表中的元组的第一项排序,相同时再比较第二项

print(sorted(list1))

02 方法二:使用 sorted 函数的 key 参数

1

2

3

4

5

6

7

from random import randint

# 生成随机字典

d = {x:randint(60,100) for x in 'xyzabc'}

print(d)

# d.items() 也是一个元组的列表,只是元组中键在前,值在后

# 使用 key 参数设置以第二项 (值)作为排序依据

print(sorted(d.items(), key = lambda x: x[1]))

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

01 方法一:传统方法,依次遍历

1

2

3

4

5

6

7

8

9

10

11

12

13

14

from random import randint, sample

# 随机产生 3 场球赛的 进球人和数

s1 = {x: randint(1,4) for x in sample('abcdefg',randint(3,6))}

s2 = {x: randint(1,4) for x in sample('abcdefg',randint(3,6))}

s3 = {x: randint(1,4) for x in sample('abcdefg',randint(3,6))}

print(s1)

print(s2)

print(s3)

# 传统方法

res = []

for k in s1:

    if k in s2 and k in s3:

        res.append(k)

print(res)

02 方法二:利用集合(set)的交集操作

利用字典的keys() 方法,得到一个字典的 keys 的集合

取所有字典的 keys 的集合的交集

1

2

3

4

5

6

7

8

9

from random import randint, sample

# 随机产生 3 场球赛的 进球人和数

s1 = {x: randint(1,4) for x in sample('abcdefg',randint(3,6))}

s2 = {x: randint(1,4) for x in sample('abcdefg',randint(3,6))}

s3 = {x: randint(1,4) for x in sample('abcdefg',randint(3,6))}

print(s1)

print(s2)

print(s3)

print(s1.keys() & s2.keys() & s3.keys())

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

1

2

3

4

5

6

d = dict()

d['Jim']=(1.35)

d['Leo']=(2,37)

d['Bob']=(3,45)

for k in d:

    print(k)

方法:使用collections.OrderedDict

以OrderedDict替代字典Dict,依次将选手成绩存入OrderedDict。

1

2

3

4

5

6

7

from collections import OrderedDict

d = OrderedDict()

d['Jim']=(1.35)

d['Leo']=(2,37)

d['Bob']=(3,45)

for k in d:

    print(k)

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

原始代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

from random import randint

N = randint(0, 100)

def guess(k):

    if k == N:

        print('猜对了')

        return True

    elif k < N:

        print('猜小了')

    else:

        print('猜大了')

    return False

while True:

    line = input("please input a number:")

    if line.isdigit():

        k = int(line)

        if guess(k):

            break

我们希望保存最近 5 次猜的数字,之前的就被删除

解决方案:

使用容量为 n (本例中 n=5) 的队列存储历史记录

使用标准库中的 deque,它是一个双端循环队列

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

from random import randint

from collections import deque

history = deque([], 5)

N = randint(0, 100)

def guess(k):

    if k == N:

        print('猜对了')

        return True

    elif k < N:

        print('猜小了')

    else:

        print('猜大了')

    return False

while True:

    line = input("please input a number:")

    if line.isdigit():

        k = int(line)

        history.append(k)

        if guess(k):

            break

    elif line == 'history' or line == 'h?':

        print(history)

若我们还希望 程序下次运行时,可以查看之前的历史记录,就需要将 队列对象 保存到磁盘,可以使用 pickle

pickle 可以将任意类型的数据(包括 数字型、列表、字典、字符串等)保存到磁盘文件,在需要的时候还可以正常读回为原数据

解决方案:程序退出前,可以使用 pickle 将队列对象存入文件,再次运行程序时将其导入

pickle 的用法:

写数据:

1

2

3

4

import pickle

data = [1, 2, 3, 4]

with open('data.dat', 'wb') as f:

    pickle.dump(data, f)

读数据:

1

2

3

4

import pickle

with open('data.dat', 'rb') as f:

    data = pickle.load(f)

print(data)

今天就是借助一些基础的代码案例,给大家分享讲解Python中的字典和集合在实际编程中的一些使用技巧,希望对您有所帮助!

转自:微点阅读   https://www.weidianyuedu.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值