1、一山不容二虎的集合
2、frozenset
3、字典
4、defaultdict
5、内置数据结构总结
6、项目实战:MD5在线加密解密工具
集合(set)是一个无序的不重复元素序列。 1,2,3,4,1,2,3 = 1,2,3,4
1). 使用大括号 { } 或者 set() 函数创建集合;
2). 注意:
l 创建一个空集合必须用 set() 而不是 { }
l { } 是用来创建一个空字典。
add: 添加单个元素到集合中
update: 添加多个元素到集合中
remove: 如果元素存在, 直接删除, 如果不存在, 抛出异常KeyError。
discard:如果元素存在, 直接删除, 如果不存在, do nothing。
pop:随机删除指定元素, 并返回删除的值。
clear:清空集合。
支持的特性:成员操作副
不支持的操作:索引/切片,重复,连接操作符
判断nums的长度和去重之后的长度是否一致,
如果不一致, 则有重复的元素, 返回True
如果一致, 则没有重复的元素, 返回False
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从大到小排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作(同一个测试用例里可能会有多组数据,希望大家能正确处理)。
1). 生成了N个1到1000之间的随机整数(N≤1000)
2). 去重: 其中重复的数字,只保留一个,把其余相同的数去掉
3). 从大到小排序
"""
import random
# 2). 去重: 其中重复的数字,只保留一个,把其余相同的数去掉.生成一个空集合
nums = set()
N = int(input('N: '))
# 1). 生成了N个1到1000之间的随机整数(N≤1000)
for count in range(N):
num = random.randint(1, 1000)
nums.add(num)
# 3). 从大到小排序, li.sort()智能对列表进行排序; sorted()方法可以对任意数据类型排序。
print(sorted(nums, reverse=True))
frozenset 是 set 的不可变版本。
因此 set 集合中所有能改变集合本身方法(如 add、remove、discard、xxx_update 等),frozenset 都不支持;
set 集合中不改变集合本身的方法,fronzenset 都支持。
frozenset 的这些方法和 set 集合同名方法的功能完全相同。
frozenset 的作用主要有两点:
• 当集合元素不需要改变时,使用 frozenset 代替 set 更安全。
• 当某些 API 需要不可变对象时,必须用 frozenset 代替set。
比如 dict 的 key 必须是不可变对象,因此只能用 frozenset;
再比如 set 本身的集合元素必须是不可变的,因此 set 不能包含 set,set 只能包含 frozenset。
字典是另一种可变容器模型,且可存储任意类型对象。
键一般是唯一的,如果重复最后的一个键值对会替换前面的,值不需要唯一。
d = {key1 : value1, key2 : value2 }
d = {‘Z’ : ‘字’, ‘D’ : ‘典’ }
作为字典(key-value)的经典应用题目,单词统计几乎出现在每一种语言键值对学习后的必练题目,
主要需求:
写一个函数wordcount统计一篇文章的每个单词出现的次数(词频统计)。
统计完成后,对该统计按单词频次进行排序。
from collections import Counter
text = """
Introducing Red Hat Enterprise Linux 7
Red Hat Enterprise Linux 7 showcases the latest features in an enterprise operating system
Introducing Red Hat Enterprise Linux 7
Red Hat Enterprise Linux 7 showcases the latest features in an enterprise operating system
Introducing Red Hat Enterprise Linux 7
Red Hat Enterprise Linux 7 showcases the latest features in an enterprise operating system
Introducing Red Hat Enterprise Linux 7
Red Hat Enterprise Linux 7 showcases the latest features in an enterprise operating system
Enterprise architects will appreciate new capabilities such as lightweight application isolation.
Application developers will welcome an updated development environment and application-profiling tools. Read more at the Red Hat Developer Blog.
System administrators will appreciate new management tools and expanded file-system options with improved performance and scalability.
Deployed on physical hardware, virtual machines, or in the cloud, Red Hat Enterprise Linux 7 delivers the advanced features required for next-generation architectures.
Where to go from here:
Red Hat Enterprise Linux 7 Product Page
The landing page for Red Hat Enterprise Linux 7 information. Learn how to plan, deploy, maintain, and troubleshoot your Red Hat Enterprise Linux 7 system.
Red Hat Customer Portal
Your central access point to finding articles, videos, and other Red Hat content, as well as manage your Red Hat support cases.
Documentation
Provides documentation related to Red Hat Enterprise Linux and other Red Hat offerings.
Red Hat Subscription Management
Web-based administration interface to efficiently manage systems.
Red Hat Enterprise Linux Product Page
Provides an entry point to Red Hat Enterprise Linux product offerings.
"""
# 1. 先拿出字符串里面的所有单词;
words = text.split() # ['hello', 'world', 'hello', 'python', 'hello', 'java']
"""
# text = "hello world hello python hello java"
# words = ['hello', 'world', 'hello', 'python', 'hello', 'java']
# word_count_dict = {
# 'hello': 3,
# 'world': 1,
# 'python':1,
# 'java':1
# }
"""
# 2. 统计每个单词出现的次数
# 1). 如何存储统计好的信息: 字典存储{'hello':3, 'world':1, 'python':1, 'java':1}
# 2). 如何处理?
word_count_dict = {
}
for word in words:
if word not in word_count_dict:
word_count_dict[word] = 1
else:
word_count_dict[word] += 1
print(word_count_dict)
# 3. 排序,获取出现次数最多的单词
counter = Counter(word_count_dict)
print(counter.most_common(5))
collections.defaultdict类,
本身提供了默认值的功能, 默认值可以是整形,列表,集合等.
defaultdict 是 dict 的子类。
但它与 dict 最大的区别在于,
如果程序试图根据不存在的 key 访问 value,会引发KeyError 异常;
而 defaultdict 提供default_factory 属性,该为不存在的 key 来自动生成生成默认的 value。
需求:
我们想要一个能将键(key)映射到多个值的字(即所谓的一键多值字典)
解决方案:
1). 字典是一种关联容器,每个键都映射到一个单独的值上。如果想让键映射到多个值,需要将这些多个
值保存到容器(列表或者集合)中。
2). 利用collections模块中的defaultdict类自动初始化第一个值,这样只需关注添加元素.
可变数据类型:
可以增删改。可变数据类型,允许变量的值发生变化,即如果对变量进行append、+=等
这种操作后,只是改变了变量的值,而不会新建一个对象,变量引用的对象的地址也不会变化,
不过对于相同的值的不同对象,在内存中则会存在不同的对象,
即每个对象都有自己的地址,相当于内存中对于同值的对象保存了多份,这里不存在引用计数,是实实在在的对象。
集合是可变类型
不可变数据类型:
不可以增删改。python中的不可变数据类型,不允许变量的值发生变化,如果改变了变量的值,相当于是新建了一个对象,而对于相同的值的对象,在内存中则只有一个对象,内部会有一个引用计数来记录有多少个变量引用这个对象。
有序序列拥有的特性: 索引、切片、连接操作符、重复操作符以及成员操作符等特性。
https://www.cmd5.com/,
本项目针对md5、sha1等全球通用公开的加密算法进行反向查询,通过穷举字符组合的方式,创建了明文密文对应查询数据库,创建的记录约90万亿条,占用硬盘超过500TB,查询成功率95%以上,很多复杂密文只有本站才可查询。已稳定运行十余年,国内外享有盛誉。
MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。hashlib库进行md5加密,
操作如下:
MD5目前人类是无法解密的,目前人类的MD5解密方法是建立一个大型数据库,将各
个人的MD5数据存储在这个数据库里面,然后将所需要解密的密码放入该库对比找到
同样原码,如果没有对比到数据,说明该密没有被记录过,也就是说没有办法解密了。