教小朋友学 Python -- 字典与集合



背景

到目前为止,我们已经学习了以下五部分内容:

教小朋友学 Python -- 变量、运算符与数据类型教小朋友学 Python -- 条件与循环教小朋友学 Python -- 列表与元组教小朋友学 Python -- 字符串与序列教小朋友学 Python -- 函数与Lambda表达式

今天,我们一起来学习第六部分的内容:字典 与 集合。

Python 基础语法

1. 字典

序列是以连续的整数为索引,与此不同的是,字典以"关键字"为索引,关键字可以是任意不可变类型,通常用字符串或数值。字典是 Python 唯一的一个 映射类型,字符串、元组、列表属于序列类型。

创建和访问字典

字典是无序的 键:值对(key:value 对)集合,键必须是互不相同的(在同一个字典之内)。

brand = ['李宁', '耐克', '阿迪达斯'] slogan = ['一切皆有可能', 'Just do it', 'Impossible is nothing'] print('耐克的口号是:', slogan[brand.index('耐克')]) # 耐克的口号是: Just do it dict1 = {'李宁': '一切皆有可能', '耐克': 'Just do it', '阿迪达斯': 'Impossible is nothing'} print('耐克的口号是:', dict1['耐克']) # 耐克的口号是: Just do it dict2 = {1: 'one', 2: 'two', 3: 'three'} print(dict2) # {1: 'one', 2: 'two', 3: 'three'} print(dict2[1]) # one dict3 = {'rice': 35, 'wheat': 101, 'corn': 67} print(dict3) # {'wheat': 101, 'corn': 67, 'rice': 35} print(dict3['rice']) # 35 dict(object) 函数用于创建一个字典。dict() -> new empty dictionarydict(mapping) -> new dictionary initialized from a mapping object's (key, value) pairsdict(iterable) -> new dictionary initialized as if via:

d = {} for k, v in iterable: d[k] = v dict(**kwargs) -> new dictionary initialized with the name=value pairs in the keyword argument list. For example: dict(one=1, two=2)

dict4 = dict([('apple', 4139), ('peach', 4127), ('cherry', 4098)]) print(dict4) # {'cherry': 4098, 'apple': 4139, 'peach': 4127} dict4 = dict((('apple', 4139), ('peach', 4127), ('cherry', 4098))) print(dict4) # {'peach': 4127, 'cherry': 4098, 'apple': 4139} dict内部存放的顺序和key放入的顺序是没有关系的。dict查找和插入的速度极快,不会随着key的增加而增加,但是需要占用大量的内存。把数据放入dict还可以直接通过key放入。一个key只能对应一个value,多次对一个key放入value,后面的值会把前面的值冲掉。

dict5 = dict(a=1, b=2, c=3) print(dict5) # {'b': 2, 'a': 1, 'c': 3} dict5['a'] = 11 print(dict5) # {'b': 2, 'a': 11, 'c': 3} dict5['d'] = 4 print(dict5) # {'d': 4, 'c': 3, 'a': 11, 'b': 2}

字典的内置方法

dict.fromkeys(seq[, value]) 用于创建一个新字典,以序列 seq 中元素做字典的键,value 为字典所有键对应的初始值。

seq = ('name', 'age', 'sex') dict6 = dict.fromkeys(seq) print("新的字典为 : %s" % str(dict6)) # 新的字典为 : {'name': None, 'age': None, 'sex': None} dict6 = dict.fromkeys(seq, 10) print("新的字典为 : %s" % str(dict6)) # 新的字典为 : {'name': 10, 'age': 10, 'sex': 10} dict6 = dict.fromkeys(seq, ('小马', '8', '男')) print("新的字典为 : %s" % str(dict6)) # 新的字典为 : {'name': ('小马', '8', '男'), 'age': ('小马', '8', '男'), 'sex': ('小马', '8', '男')} dict.keys()返回一个可迭代对象,可以使用 list() 来转换为列表。

dict = {'Name': 'lsgogroup', 'Age': 7} print(dict.keys()) # dict_keys(['Name', 'Age']) lst = list(dict.keys()) # 转换为列表 print(lst) # ['Name', 'Age'] dict.values()返回一个迭代器,可以使用 list() 来转换为列表,列表为字典中的所有值。

dict = {'Sex': 'female', 'Age': 7, 'Name': 'Zara'} print("字典所有值为 : ", list(dict.values())) # 字典所有值为 : [7, 'female', 'Zara'] dict.items()以列表返回可遍历的(键, 值) 元组数组。

dict = {'Name': 'Lsgogroup', 'Age': 7} print("Value : %s" % dict.items()) # Value : dict_items([('Name', 'Lsgogroup'), ('Age', 7)]) print(tuple(dict.items())) # (('Name', 'Lsgogroup'), ('Age', 7)) dict.get(key, default=None)返回指定键的值,如果值不在字典中返回默认值。

dict = {'Name': 'Lsgogroup', 'Age': 27} print("Age 值为 : %s" % dict.get('Age')) # Age 值为 : 27 print("Sex 值为 : %s" % dict.get('Sex', "NA")) # Sex 值为 : NA key in dict in 操作符用于判断键是否存在于字典中,如果键在字典 dict 里返回true,否则返回false。而not in操作符刚好相反,如果键在字典 dict 里返回false,否则返回true。

dict = {'Name': 'Lsgogroup', 'Age': 7} # 检测键 Age 是否存在 if 'Age' in dict: print("键 Age 存在") else: print("键 Age 不存在") # 检测键 Sex 是否存在 if 'Sex' in dict: print("键 Sex 存在") else: print("键 Sex 不存在") # not in # 检测键 Age 是否存在 if 'Age' not in dict: print("键 Age 不存在") else: print("键 Age 存在") # 键 Age 存在 # 键 Sex 不存在 # 键 Age 存在 dict.clear()用于删除字典内所有元素。

dict = {'Name': 'Zara', 'Age': 7} print("字典长度 : %d" % len(dict)) # 字典长度 : 2 dict.clear() print("字典删除后长度 : %d" % len(dict)) # 字典删除后长度 : 0 dict.copy()返回一个字典的浅复制。

Sample1:

dict1 = {'Name': 'Lsgogroup', 'Age': 7, 'Class': 'First'} dict2 = dict1.copy() print("新复制的字典为 : ", dict2) # 新复制的字典为 : {'Age': 7, 'Name': 'Lsgogroup', 'Class': 'First'}

Sample2:直接赋值和 copy 的区别

dict1 = {'user': 'lsgogroup', 'num': [1, 2, 3]} # 引用对象 dict2 = dict1 # 深拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用 dict3 = dict1.copy() print(id(dict1)) # 148635574728 print(id(dict2)) # 148635574728 print(id(dict3)) # 148635574344 # 修改 data 数据 dict1['user'] = 'root' dict1['num'].remove(1) # 输出结果 print(dict1) # {'user': 'root', 'num': [2, 3]} print(dict2) # {'user': 'root', 'num': [2, 3]} print(dict3) # {'user': 'runoob', 'num': [2, 3]} dict.pop(key[,default])删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。否则,返回default值。

dict1 = {1: "a", 2: [1, 2]} print(dict1.pop(1), dict1) # a {2: [1, 2]} # 设置默认值,必须添加,否则报错 print(dict1.pop(3, "nokey"), dict1) # nokey {2: [1, 2]} dict.popitem()随机返回并删除字典中的一对键和值,如果字典已经为空,却调用了此方法,就报出KeyError异常。

dict1 = {1: "a", 2: [1, 2]} print(dict1.popitem()) # (1, 'a') print(dict1) # {2: [1, 2]} dict.setdefault(key, default=None)和get()方法 类似, 如果键不存在于字典中,将会添加键并将值设为默认值。

dict = {'Name': 'Lsgogroup', 'Age': 7} print("Age 键的值为 : %s" % dict.setdefault('Age', None)) # Age 键的值为 : 7 print("Sex 键的值为 : %s" % dict.setdefault('Sex', None)) # Sex 键的值为 : None print("新字典为:", dict) # 新字典为: {'Age': 7, 'Name': 'Lsgogroup', 'Sex': None} dict.update(dict2)把字典参数 dict2 的 key/value(键/值) 对更新到字典 dict 里。

dict = {'Name': 'Lsgogroup', 'Age': 7} dict2 = {'Sex': 'female', 'Age': 8} dict.update(dict2) print("更新字典 dict : ", dict) # 更新字典 dict : {'Sex': 'female', 'Age': 8, 'Name': 'Lsgogroup'}

2. 集合

与dict类似,set也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。

num = {} print(type(num)) # num = {1, 2, 3, 4} print(type(num)) #

集合的创建

直接把一堆元素用花括号括起来,重复元素在set中会被自动被过滤。

basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'} print(basket) # {'banana', 'apple', 'pear', 'orange'} 使用set(value)工厂函数。

a = set('abracadabra') print(a) # {'r', 'b', 'd', 'c', 'a'} b = set(("Google", "Lsgogroup", "Taobao", "Taobao")) print(b) # {'Taobao', 'Lsgogroup', 'Google'} c = set(["Google", "Lsgogroup", "Taobao", "Google"]) print(c) # {'Taobao', 'Lsgogroup', 'Google'} 去掉列表中重复的元素

lst = [0, 1, 2, 3, 4, 5, 5, 3, 1] temp = [] for item in lst: if item not in temp: temp.append(item) print(temp) # [0, 1, 2, 3, 4, 5] a = set(lst) print(list(a)) # [0, 1, 2, 3, 4, 5]

访问集合中的值

可以使用for把集合中的数据一个个读取出来。

thisset = set(['Google', 'Baidu', 'Taobao']) for item in thisset: print(item) # Baidu # Google # Taobao 可以通过in或not in判断一个元素是否在集合中已经存在

thisset = set(['Google', 'Baidu', 'Taobao']) print('Taobao' in thisset) # True print('Facebook' not in thisset) # True

集合的内置方法

set.add(elmnt)用于给集合添加元素,如果添加的元素在集合中已存在,则不执行任何操作。

fruits = {"apple", "banana", "cherry"} fruits.add("orange") print(fruits) # {'orange', 'cherry', 'banana', 'apple'} fruits.add("apple") print(fruits) # {'orange', 'cherry', 'banana', 'apple'} set.remove(item)用于移除集合中的指定元素。

fruits = {"apple", "banana", "cherry"} fruits.remove("banana") print(fruits) # {'apple', 'cherry'} set.update(set)用于修改当前集合,可以添加新的元素或集合到当前集合中,如果添加的元素在集合中已存在,则该元素只会出现一次,重复的会忽略。

x = {"apple", "banana", "cherry"} y = {"google", "baidu", "apple"} x.update(y) print(x) # {'cherry', 'banana', 'apple', 'google', 'baidu'} 由于 set 是无序和无重复元素的集合,所以两个或多个 set 可以做数学意义上的集合操作。set.intersection(set1, set2 …)用于返回两个或更多集合中都包含的元素,即交集。set.union(set1, set2…)返回两个集合的并集,即包含了所有集合的元素,重复的元素只会出现一次。set.difference(set) 返回集合的差集,即返回的集合元素包含在第一个集合中,但不包含在第二个集合(方法的参数)中。

a = set('abracadabra') b = set('alacazam') print(a) # {'r', 'a', 'c', 'b', 'd'} print(b) # {'c', 'a', 'l', 'm', 'z'} # 交集 print(a & b) # {'c', 'a'} c = a.intersection(b) print(c) # {'a', 'c'} # 并集 print(a | b) # {'l', 'd', 'm', 'b', 'a', 'r', 'z', 'c'} c = a.union(b) print(c) # {'c', 'a', 'd', 'm', 'r', 'b', 'z', 'l'} # 差集 print(a - b) # {'d', 'b', 'r'} c = a.difference(b) print(c) # {'b', 'd', 'r'} set.issubset(set)用于判断集合的所有元素是否都包含在指定集合中,如果是则返回 True,否则返回 False。

x = {"a", "b", "c"} y = {"f", "e", "d", "c", "b", "a"} z = x.issubset(y) print(z) # True x = {"a", "b", "c"} y = {"f", "e", "d", "c", "b"} z = x.issubset(y) print(z) # False set.issuperset(set)用于判断指定集合的所有元素是否都包含在原始的集合中,如果是则返回 True,否则返回 False。

x = {"f", "e", "d", "c", "b", "a"} y = {"a", "b", "c"} z = x.issuperset(y) print(z) # True x = {"f", "e", "d", "c", "b"} y = {"a", "b", "c"} z = x.issuperset(y) print(z) # False

3. 不可变集合

frozenset([iterable]) 返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。

a = frozenset(range(10)) # 生成一个新的不可变集合 print(a) # frozenset({0, 1, 2, 3, 4, 5, 6, 7, 8, 9}) b = frozenset('lsgogroup') print(b) # frozenset({'g', 's', 'p', 'r', 'u', 'o', 'l'})

总结

好了,到此为止有关于 字典 和 集合 部分就介绍完了,小朋友们要根据上面的例子多多体会,只有刻意练习才能掌握一门技术,没有捷径的,加油啊!See You!

相关图文

资料分享:数学建模资料分享 -- 图论部分资料分享:数学建模资料分享 -- 神经网络部分如何利用 C# 实现 K 最邻近算法?如何利用 C# 实现 K-D Tree 结构?如何利用 C# + KDTree 实现 K 最邻近算法?如何利用 C# 对神经网络模型进行抽象?如何利用 C# 实现神经网络的感知器模型?如何利用 C# 实现 Delta 学习规则?如何利用 C# 实现 误差反向传播 学习规则?如何利用 C# 爬取带 Token 验证的网站数据?如何利用 C# 向 Access 数据库插入大量数据?如何利用 C# + Python 破解猫眼电影的反爬虫机制?

经过8年多的发展,LSGO软件技术团队在「地理信息系统」、「数据统计分析」、「计算机视觉」等领域积累了丰富的研发经验,也建立了人才培养的完备体系,由于自己准备在「量化交易」领域精进技能,如果大家对这个领域感兴趣可以与我联系,加入我们的量化学习群一起学习探讨。

在这个领域我已做了以下积累:

策略部分:

数字货币 One 的投资价值分析数字资产量化中的跨市场套利策略数字资产量化中的同市场套利策略数字资产量化中的网格交易法我们能否效仿李笑来的投资策略?赚钱是刚需,如何正确的交易股票?

数据部分:

如何利用 C# 爬取 One 的交易数据?如何利用 C# 爬取 One 持有者返利数据?如何利用 C# 爬取BigOne交易所的公告?如何利用 C# 爬取Gate.io交易所的公告?如何利用 C# 爬取「财报说」中的股票数据?

自动化交易部分:

封装BigOne API:身份验证封装BigOne API:获取账户资产封装BigOne API:订单系统封装BigOne API:网格交易法封装BigOne API:代码的重构进一步完善自动化交易系统 01进一步完善自动化交易系统 02进一步完善自动化交易系统 03进一步完善自动化交易系统 04如何开发「股票数据分析软件」(上)如何开发「股票数据分析软件」(中)如何开发「股票数据分析软件」(下)进一步完善「股票数据分析软件」 - 01

后台回复「搜搜搜」,随机获取电子资源!

欢迎关注,请扫描二维码: