集合定义总结创建一个空集合必须用 set() 而不是 { }.{ } 是用来创建一个空字典。集合里面的元素必须是不可变的数据类型。通过set方法可以将列表/元组/字符串转换成集合数据类型。

>>> s1 = {}>>> type(s1)<class 'dict'>>>> s2 = {1, 2, 3}>>> type(s2)<class 'set'>>>> s3 = {1, 3.14, True, 'hello', [1, 2, 3], (1, 2, 3)}Traceback (most recent call last): File "<stdin>", line 1, in <module>TypeError: unhashable type: 'list'>>> s3 = {1, 3.14, True, 'hello',(1, 2, 3)}>>> type(s3)<class 'set'>>>> s4 = set([])>>> type(s4)<class 'set'>>>> s5 = set('abcde')>>> s5{'c', 'e', 'b', 'a', 'd'}>>> type(s5)<class 'set'>

集合(set)是一个无序的不重复元素序列。1,2,3,4,1,2,3 = 1,2,3,4
集合的创建:
1). 使用大括号 { } 或者 set() 函数创建集合;
2). 注意:
l 创建一个空集合必须用 set() 而不是 { }
l { } 是用来创建一个空字典。

集合常用方法

#1). 集合的增加#add: 添加单个元素到集合中#update: 添加多个元素到集合中set1 = { 1, 2, 3 }set1.add(4)print(set1)set1.add(3)print(set1)set1.update({2, 3, 4, 5, 6})print(set1)#2). 集合的删除#remove: 如果元素存在, 直接删除, 如果不存在, 抛出异常KeyError。#discard:如果元素存在, 直接删除, 如果不存在, do nothing。#pop:随机删除指定元素, 并返回删除的值。#clear:清空集合。set2 = {1, 2, 3, 4}set2.remove(2)print(set2)#集合是一个无序的数据类型。最后增加的元素不一定存储在集合最后。#无序意味着索引值会随时变化, 因此不可以索引和切片。set2 = {9991, 29, 33, 4}print(set2)set2.add(11)print(set2)set2.pop()print(set2)set2 = {1, 2, 3, 4}set2.discard(5)print(set2)#set2 = {1, 2, 3, 4}#set2.remove(5)#print(set2)set2.clear()print(set2)#3). 集合的查看set1 = {1, 2, 3}set2 = {1, 2, 4}print("交集是: ", set1 & set2) # {1, 2}print("并集是: ", set1 | set2) # {1, 2, 3, 4}print("差集是: ", set1 - set2) # {3} set1 - set2 = set1 - (set1 & set2)print("差集是: ", set2 - set1) # {4} set2 - set1 = set2 - (set1 & set2)print("对等差分是: ", set2 ^ set1) # {3, 4} (set1 | set2) - (set1 & set1)"""set1 = {1, 2, 3}set2 = {1, 2, 4}print("交集是: ", set1.intersection(set2)) # {1, 2}#print("交集是: ", set1.intersection_update(set2)) # {1, 2} set1 = set1 & set2print("并集是: ", set1.union(set2)) # {1, 2, 3, 4}print("差集是: ", set1.difference(set2)) # {3} set1 - set2 = set1 - (set1 & set2)print("差集是: ", set2.difference(set1)) # {4} set2 - set1 = set2 - (set1 & set2)print("对等差分是: ", set1.symmetric_difference(set2)) # {3, 4} (set1 | set2) - (set1 & set1)set3 = {1, 2}set4 = {1, 2, 4}print(set3.isdisjoint(set4)) # Falseprint(set3.issubset(set4)) # Trueprint(set4.issuperset(set3)) # True

总结:

URL地址去重:

urls = [ 'http://www.baidu.com', 'http://www.qq.com', 'http://www.qq.com', 'http://www.163.com', 'http://www.csdn.com', 'http://www.csdn.com',]#用来存储去重的url地址analyze_urls = []#依次遍历所有的urlfor url in urls: #如果url不是analyze_urls列表成员, 则追加到列表最后。 #如果url是analyze_urls列表成员,不做任何操作。 if url not in analyze_urls: analyze_urls.append(url)print("去重之后的url地址: ", analyze_urls)"""urls = [ 'http://www.baidu.com', 'http://www.qq.com', 'http://www.qq.com', 'http://www.163.com', 'http://www.csdn.com', 'http://www.csdn.com',]print("去重之后的url地址: ",set(urls))

华为笔试编程题: 明明的随机数:

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了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应用:
#1). 当集合元素不需要改变时,使用 frozenset 代替 set 更安全。
#2). 当某些 API 需要不可变对象时,必须用 frozenset 代替set。

set1 = frozenset({1, 2, 3, 4})print(set1, type(set1))set2 = {1, 2, set1}print(set2)字典的定义:

#1). 字典可以快速通过key值查询到value值。O(1)
#2). key值是不能重复的, value值无所谓
#3). 字典的key值必须是不可变的数据类型, value值可以是任意数据类型。

info = { 'name' : 'root', # key:value ===> 键:值 key-value对/键值对 'password': 'westos', 'member': ['kiosk', 'student']}print(type(info))print(info)

#pprint==pretty print,更加美观/友好的打印模块
import pprint

#需求: 创建100个银行卡号, 6103452xxx: 6103452001, 6103452002,.........6103452100, 这些银行卡号的初始密码为666666.
#1). 生成100个卡号, 存储在列表中

cards = []for count in range(100): num = "%.3d" %(count+1) card = '6103452' + str(num) cards.append(card)#2). 快速生成卡号和密码的对应关系, 存储在字典中;cards_info = {}.fromkeys(cards, 'westos')pprint.pprint(cards_info)

"""

#zip间接创建

info = zip(['name', 'passwd'], ['root', 'westos'])#print(list(info))print(dict(info))

#通过dict传值的方式创建字典

info = dict(name='root', passwd='westos')print(info)字典的查看

students = {
'user1': [100, 100, 100],
'user2': [98, 100, 100],
'user3': [100, 89, 100],
}

#通过字典的key获取对应的value值;
print(students['user1'])
#print(students['user4']) # KeyError: 'user4', 因为key值在字典中不存在

#特别重要: get方法: 如果key存在获取对应的value值, 反之, 返回默认值(如果不指定,默认返回的是None)

print(students.get('user1')) # [100, 100, 100]print(students.get('user4', 'no user')) # 'no user'#查看所有的key值/value值/key-value值print(students.keys())print(students.values())print(students.items()) # key-value值 [(key1, value1),(key2, value2)]循环遍历字典:

##for循环字符串#for item in 'abc':#print(item)##for循环元组#for item in (1, 2, 3):#print(item)##for循环集合#for item in {1, 2, 3}:#print(item)students = { 'user1': [100, 100, 100], 'user2': [98, 100, 100], 'user3': [100, 89, 100],}#字典遍历时默认遍历的时字典的key值for key in students: print(key, students[key])#遍历字典key-value建议的方法for key,value in students.items(): # [('user1', [100, 100, 100]), ('user2', [98, 100, 100]), ('user3', [100, 89, 100])] # key,value = ('user1', [100, 100, 100]) #key,value = ('user2', [98, 100, 100]) #key,value = ('user3', [100, 89, 100]) print(key, value)字典的增加方法

import pprintstudents = { 'user1': [100, 100, 100], 'user2': [98, 100, 100], 'user3': [100, 89, 100],}#1). 根据key增加 /修改key-value#如果key存在, 修改key-value#如果key不存在, 增加key-valuestudents['user4'] = [90, 99, 89]print(students)#2). setdefault方法#如果key存在, 不做任何操作#如果key不存在, 增加key-valuestudents.setdefault('user1', [100, 89, 88])print(students)#3). update方法: 批量添加key-value#如果key存在, 修改key-value#如果key不存在, 增加key-valuenew_student = { 'westos':[100, 100, 100], 'root':[100, 100, 100], 'user1':[0, 0, 0]}students.update(new_student)pprint.pprint(students)字典的删除方法

students = { 'user1': [100, 100, 100], 'user2': [98, 100, 100], 'user3': [100, 89, 100],}##1). del dict[key]##如果key存在, 删除对应的value值##如果key不存在, 抛出异常KeyError#del students['user1']#print(students)##2). pop方法##如果key存在, 删除对应的value值##如果key不存在,如果没有提供默认值, 则抛出异常KeyError#delete_item = students.pop('user6', 'no user')#print("删除的元素是: ", delete_item)#print(students)#3). popitem方法: 随机删除字典的key-value值key, value = students.popitem()print("随机删除的内容: ", key, value)

总结:

列表去重的第三种方法

方法三: 通过字典的方式去重, 因为字典的key值是不能重复的.
"""

nums = [1, 2, 3, 1, 2, 3, 6, 7]print({}.fromkeys(nums).keys()) # {1: None, 2: None, 3: None, 6: None, 7: None} ==> [1, 2, 3, 6, 7]默认字典defaultdict

from collections import defaultdict

info = defaultdict(int)
info['a'] += 1
print(info['a'])

info = defaultdict(list)
info['a'].append(1)
print(info['a'])

info = defaultdict(set)
info['a'].add(1)
print(info['a'])
默认字典应用:

from collections import defaultdict

#1). 随机生成50个1-100之间的随机数

import randomnums = []for count in range(50): nums.append(random.randint(1, 100))#2). 把list中大于66的元素和小于66的元素分类存储sort_nums_dict = defaultdict(list) # 创建一个默认字典, 默认的value为空列表[]for num in nums: if num > 66: sort_nums_dict['大于66的元素'].append(num) else: sort_nums_dict['小于66的元素'].append(num)print(sort_nums_dict)

md5加密的实现:

#md5加密需要传递的时bytes类型passwd = b'westos'md5_passwd = hashlib.md5(passwd).hexdigest()print(md5_passwd)#tkinter#PySimpleGUIfrom string import digits#Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。hashlib库进行md5加密,操作如下import hashlib#显示程序运行的进度条from tqdm import tqdmimport jsondb = {}for item1 in tqdm(digits): for item2 in digits: for item3 in digits: for item4 in digits: for item5 in digits: for item6 in digits: passwd1 = item1 + item2 + item3 + item4 + item5 + item6 #md5加密需要的字符串时bytes类型, 将utf-8的编码格式编码成bytes类型 passwd = passwd1.encode('utf-8') md5_passwd = hashlib.md5(passwd).hexdigest() db[md5_passwd] = passwd1#将db字典的信息以json的格式存储到md5.json文件中json.dump(db, open('md5.json', 'w'))print("生成数据库成功.......")