集合定义总结
- 创建一个空集合必须用 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 & set2
print("并集是: ", 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)) # False
print(set3.issubset(set4)) # True
print(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 = []
#依次遍历所有的url
for 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 pprint
students = {
'user1': [100, 100, 100],
'user2': [98, 100, 100],
'user3': [100, 89, 100],
}
#1). 根据key增加 /修改key-value
#如果key存在, 修改key-value
#如果key不存在, 增加key-value
students['user4'] = [90, 99, 89]
print(students)
#2). setdefault方法
#如果key存在, 不做任何操作
#如果key不存在, 增加key-value
students.setdefault('user1', [100, 89, 88])
print(students)
#3). update方法: 批量添加key-value
#如果key存在, 修改key-value
#如果key不存在, 增加key-value
new_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 random
nums = []
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
#PySimpleGUI
from string import digits
#Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。hashlib库进行md5加密,操作如下
import hashlib
#显示程序运行的进度条
from tqdm import tqdm
import json
db = {}
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("生成数据库成功.......")
来源:51CTO
作者:霍金181
链接:https://blog.51cto.com/13810716/2457465