以下是搜索内容: 关闭

  • 首页
  • 日志
  • 友情链接
  • 关于我

KoiNL.

愿世间美好 温柔以待

“锦鲤握运,未离我韵”

“愿好运常在”

18 分类
0 标签
16 归档
  • 小站首页
  • 个人日志
  • 友情链接
  • 关于自己
  • 我的工具
站点信息

文章数目: 84 篇

最近动态: 2天前

上线时间: 531天

当前版本: v3.0.0

第三章 组合数据类型

分类: Python
标签:

创建日期:2022-04-16 19:04:06

组合数据类型, 分为序列类型, 集合类型和映射类型.

序列类型

序列类型有列表与集合, 列表常用操作如下:

点击显/隐代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
ll = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 列表增有追加, 逐增与按下标添加 3 种方法
ll.append(10); ll.extend((15, 20)); ll.insert(0, 0); print(ll)
# 删有按元素删与按下标删, 清空与删除 4 种方式, 其中 pop() 不指定默认最后一个
ll.remove(15); ll.pop(0); print(ll); # ll.clear(); # del ll;
# 改: 按下标改 1 种方式
ll[0] = 20; print(ll)
# 查: 查数据, 查下标, 查长度, 查最大 / 小值, 查次数 5 种方式
print(ll[5]); print(ll.index(5)); print(len(ll)); print(max(ll)); print(ll.count(20))
# 序列类型独有操作
print(520 in ll); print(ll + [123]); print(ll * 2)
# 列表类型独有操作
print(ll.copy()) # 复制
print(ll.reverse()) # 反转

3. 集合

因为去重, 因此使用场景: 元素去重
因为无序, 不支持下标操作

点击显/隐代码
1
2
3
4
5
6
7
aset = {1, 2, 3, 4, 1}
aset.add(5) # 追加
aset.update((10, 20)) #逐增
# set.remove(5) # 删除集合中的指定数据, 不存在会报错
# set.discard(5) # 删除集合中的指定数据, 不存在不会报错
# set.pop() # 随机删除集合中某个数据, 清空删除方法仍用 clear 与 del
print(aset)

4. 字典

点击显/隐代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
dict = {'name':'koi_nl', 'sex':'👨'}
dict['name'] = 'Koi_NL' # 改-Key修改法
dict['id'] = '001' # 增-Key增加法
dict.pop('id')
# 清除和删除同列表, clear 与 del
# print(dict) # 查-查找整个字典
# print(dict['name']) # 查-查找某Key值
# print(dict.get('id',0)) # 查-查找字典某Key值,若不存在返回第二个参数(默认值None)
# print(dict.keys()) # 查-查找所有的Key
# print(dict.values()) # 查-查找所有的value
# print(dict.items()) # 查-查找所有的key_value, 返回的为[('key1','value1'),('key2','value2')]

for key in dict: # 遍历字典的Key
print(key, end = ' ')
for value in dict.values(): # 遍历字典的Value
print(value, end = ' ')
for item in dict.items(): # 遍历字典的元素: 以元组形式显示
print(item, end = ' ')

3. 推导式

  1. 列表推导式
    有句口诀: 空列表尾加法无脑列表推导式就是了
点击显/隐代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
def isPrime():
"""判断函数是否为质数"""
n = eval(input("输数"))
for i in range(2, n // 2 + 1): # 从 2 循环到该数的一半数字
if n % i == 0: # 如果有相除为 0 的, 该数不是质数
return False
return True # 反之则反


def isPrime(n): # 上函数不能转为列表推导式, 改个写法
ll = [] # 空列表存储数据
for i in range(2, n // 2 + 1):
ll.append(n % i) # 追加相除后的余数
return 0 not in ll # 判断这些余数里面有无 0 , 无 True, 有则反


"""空列表尾加法, 我嗅到了列表推导式的味道"""


def isPrime(n): return 0 not in [n % i for i in range(2, n // 2 + 1)]


def genPrime(a, b):
"""将 a, b 区间的质数以列表形式显示...当然字符串也行, 我只是为了列表推导式"""
ll = [] # 空列表
for n in range(a, b + 1): # 从区间由 a 到 b 遍历循环
if isPrime(n): # 如果是素数
ll.append(n) # 追加
return ll # 返回列表


"""空列表尾加法, 我嗅到了列表推导式的味道"""


def genPrime(a, b): return [n for n in range(a, b + 1) if isPrime(n)]


# 这不得俩函数叠一起
def genPrime(a, b): return [n for n in range(a, b + 1) if 0 not in [n % i for i in range(2, n // 2 + 1)]]


# 唔嗯, 定义一行, 调用一行, 哎呀不愧是我~
print(genPrime(1, 100)) # 1 ~ 100 区间的质数: [1, 2, 3, 5, 7, ...]

  1. 集合推导式
    还是老样子, 空集合增加法无脑集合推导式就行了
点击显/隐代码
1
2
3
4
5
6
7
8
list = [1,2,3]

set = set()
for i in list:
set.add(i * 2)
# 空集合尾增法, 我嗅到了集合推导式的味道
set = {i * 2 for i in list}
print(set)
  1. 字典推导式
点击显/隐代码
1
2
3
4
5
6
7
8
9
10
11
list = ['name','age']
list_f = ['Koi_NL',19]
dict= {list[i]:list_f[i] for i in range(len(list))}
print(dict)
# 提取字典中目标数据
dict['weight'] = 50
del dict['name']
# 现在字典数据有:{ 'age': 19, 'weight': 50}
# 需求: 提取出大于25的数据
a ={key:value for key,value in dict.items() if value > 25}
print(a)

4. jieba 库

第三方库, 需要安装. 中文分词库

点击显/隐代码
1
2
3
4
5
6
7
from jieba import *
setLogLevel(logging.INFO)
print(lcut("锦鲤未离在中华人民共和国")) # 平平无奇
print(lcut("锦鲤未离在中华人民共和国", cut_all=True)) # 全模式, 冗余最长
print(lcut_for_search("锦鲤未离在中华人民共和国")) # 搜索引擎常用的索引
add_word("锦鲤未离")
print(lcut("锦鲤未离在中华人民共和国")) # 增加词汇

5. 综合案例

  1. 重复元素判定. 编写一个函数, 用列表作为参数, 如果一个函数在该列表种出现了超过一次, 返回 True, 反之则反, 但不改变列表的值.
点击显/隐代码
1
2
3
4
5
6
7
def judge(list):
t =set(list) # 列表转集合, 去重!
if len(t) !=len(list): # 长度不一致
return True # 有重复值
else: # 反之
return False # 无重复值
print(judge(list(input("输值 (例: 123456): "))))
  1. 文本词频统计. 来吧, 统计下三国演义的人物出场统计吧!
点击显/隐代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from jieba import *; setLogLevel(logging.INFO)    #我也不想要第二句, 但没有程序能运行, 但有红色提醒...
excludes = {'将军', '却说', '丞相'} # 排除词汇, 若不加这一行会有例如 "将军" , "丞相" 不是人名的常用词
txt = open("三国演义.txt", "r", encoding='utf-8').read()
words = lcut(txt) # 进行分词: ...'一员大将', ',', '乃是', '张飞', '。'...
counts = {}
for word in words:
if len(word) == 1:
continue # 排除单个字符的分词结果, 不然排行前三的...是 ',''。'和':'
elif word == "孔明曰" or word == "孔明":
rword = "诸葛亮" # 增加同人不同名的处理
else:
rword = word
counts[rword] = counts.get(rword, 0) + 1
for word in excludes:
del(counts[word])
items = list(counts.items()) # 将字典转换为列表[('不以为意', 3), ('努力', 13), ('帝后', 7),...]
items.sort(key=lambda x: x[1], reverse=True) # 进行排序: 依据下标为 1 的元素进行从大到小的排序
for i in range(15): # 选出前 5
word, count = items[i] # 分两变量接受值
print(word, "\t", count)
# 当然走到这一步还是没有完成, 例如前十五个有 '曹操' , 也有 '商议' , 或者 '玄德曰' , 不过万变不离其宗
# '玄德曰' 可以继续在 6 ~ 13 中增加同人不同名的处理, '商议' 可以在第 3 行中继续排除无关词汇
# 我这一程序就编到这里吧, 我想!!☆⌒(*^-゜)v
  1. 生日悖论. 指如果一个房间里有23 或以上人,那么至少有两个人生日相同的 概率大于50%。编写程序,输出在不同随机样本数量下,23 个人中至少两个人生日相同的概率。
点击显/隐代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from random import *

# def duplicate(lst): # 判断是否有在同一天的人, 因为集合去重
# return len(lst)>len(set(lst)) # 长度不一致就说明有
"""只有一行, 我嗅到了匿名函数的味道"""
is_same = lambda lst: len(lst) > len(set(lst))
# def generate():
# birthday=[] # 空列表
# for i in range(23): # 遍历 23 次
# birthday.append(randint(1,365)) # 追加一年的随机某天
# return birthday # 返回该列表
"""空列表尾增法, 我嗅到了列表推导式的味道↓"""


def generate(): return [randint(1, 365) for i in range(23)]


def count_same():
count = 0 # 计数器
for i in range(10000): # 验证 10000 次, 更精确
birthday = generate() # 得到 23 个人的生日列表
if is_same(birthday): # 如果生日有相同
count += 1 # 计数器 +1
return count # 返回 10000 次中生日相同的次数


print(f"概率是{(float(count_same) / 10000) * 100}%")
# 概率是 10000 次中生日相同的次数占总循环次数的比例

点击显/隐代码
1

浏览量

评论区

欢迎你留下宝贵的意见,昵称输入QQ号会显示QQ头像哦~

目录

  1. 1. 序列类型
  2. 2. 3. 集合
  3. 3. 4. 字典
  4. 4. 3. 推导式
  5. 5. 4. jieba 库
  6. 6. 5. 综合案例

上一篇: 第一章 操作基础

下一篇 第二章 函数

公告栏

《 

 》

Hello~近期剽窃本站内容频发,本站唯一指定网站:https://koinl.github.io。请认准。点击点击此处选择进入。
回到顶部
查看评论

Power By Hexo.

Theme:koinl.

信息来源于锦鲤未离