一.集合
集合(set)是一个无序的不重复元素序列
1.集合的创建
(1)、使用{},或者set()创建
set1={1,2,3,4}
a=[1,2,3]
set2=set(a) ##是将a列表转化为集合
(2)、创建空集合
注意,不可以set{},这将会是一个字典
不可以用{ }直接创建空集合,得到的是一个字典
(3)、集合中只能存放不可变数据类型【如不能存放list】
(4)、若用set()创建集合,输出的set中元素顺序不是一定的,因为集合是无序的不重复的元素序列
dir() :查看某个变量有什么方法
2.集合的常用方法
(1)增加
set.add() 给set中增加一个元素,因为set是无序的,所以即使是最后加入的,也不一定在最后一个
set.update() 给set中增加多个元素, set.update({1,2,3}), set.update(set1)
由于集合是无序的,因此集合不能切片和索引
(2)删除
set.remove() 删除set中的某个元素,如果元素存在,直接删除;若不存在,报错
set.discard() 删除set中的某个元素,如果元素存在,直接删除;若不存在,什么都不做
set.pop() 随机删除元素,并返回删除的值
set.clear() 清空集合
(3)查看
交集(&)、并集(|)、差集(-)、对等差分(^)
set1={1,2,3} set2={1,2,4}
a.交集
set1&set2={1,2}
set1.intersection(set2) set1和set2取交集
同数学中的交集
b.并集
set1|set2={1,2,3,4}
set1.union(set2) set1和set2取并集
同数学中并集
c.差集
set1-set2={3} —>set1-(set1&set2)
set2-set1={4} ---->set2-(set1&set2)
set1.diffeerent(set2) ==set1-set2
前面的集合-二者交集
d.对等差分
set1^set2={3,4}----->(set1|set2)-(set1&set2)
set1.symmetric_difference(set2)==set1^set2
并集-交集
c.与update集合使用
set1.intersection_update(set2)—>set1=set1&set2
set1={3}
(4).判断
set1={1,2,3}
set2={1,2,4}
print(set1.isdisjoint(set2)) #set1和set2没有交集嘛
print(set1.issubset(set2)) #set1是set2的子集嘛
print(set1.issuperset(set2)) #set1是set2的父集嘛
结果:
False
False
False
3.集合的特性
支持的特性:成员操作符 in/not in
不支持的特性:连接、重复、索引、切片
4.集合应用案例
(1)列表去重
列表去重
"""
#方法一:依次遍历并判断
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',
]
single_urls=[]
for url in urls:
if url not in single_urls:
single_urls.append(url)
print(single_urls)
#方法二:用集合去重
urlsset=set(urls)
print(urlsset)
结果:
['http://www.baidu.com', 'http://www.qq.com', 'http://www.163.com', 'http://www.csdn.com']
{'http://www.qq.com', 'http://www.baidu.com', 'http://www.163.com', 'http://www.csdn.com'}
(2)判断是否存在重复元素
Description:
给定一个整数数组,判断是否存在重复元素,存在返回True,不存在返回False
"""
num=[1,2,3,4,2,2]
if len(num)==len(set(num)):
print(False)
else:
print(True)
结果
True
(3)计算交集
计算交集
"""
num1=[1,2,3]
num2=[1,2,4]
a=set(num1)&set(num2)
print(a)
b=set(num1).intersection(set(num2))
print(b)
结果
{1, 2}
{1, 2}
(4)综合题
"""
Description:
明明想在学校中请一些同学一起做一项问卷调查,
为了实验的客观性,他先用计算机生成了N个1到1000之间的 随机整数(N≤1000),
对于其中重复的数字,只保留一个,把其余相同的数去掉,
不同的数对应着不同的学生的学号。
然后再把这些数从大到小排序,按照排好的顺序去找同学做调查。
请你协助明明完成“去重”与 “排序”的工作.
"""
import random
N=int(input('请输入一个小于1000的整数:'))
"""
num=[]
for i in range(N):
num.append(random.randint(1,1000))
nums=set(num)
"""
nums=set()
for i in range(N):
nums.add(random.randint(1,1000))
print(sorted(nums,reverse=True))
结果
请输入一个小于1000的整数:5
[883, 683, 552, 535, 388]
sorted()用于任何数据类型的排序,从大到小:reverse=True
5.frozenset
不可修改的集合
frozenset是不可修改的集合,因此不能进行增加、删除,但是可以查看、判断
set1=frozenset({1,2,3})
set2=frozenset({1,2,4})
a=set1&set2
print(a)
print(set1.issuperset(set2))
print(set1.pop())
结果
print(set1.pop())
AttributeError: 'frozenset' object has no attribute 'pop'
frozenset({1, 2})
False
frozenset应用场景:a.当集合元素不需要改变,为了防止自己操作失误修改,使用frozenset代替set更安全
b.当某些API需要不可改变对象时,必须用frozenset代替set
二.字典
字典是可变容器,可存储任意类型的数据
d={key1;value1,key2:value2,key3:value3}
1 .key值都是唯一的,但是value值可以是相同的
若key值出现相同的,则以最后一个出现的key值的键值对为准
2 .key值得数据类型必须是不可变类型,但是value值可以是任意类型
pprint : 导入pprint模块,使用模块中的pprint,可以更加美观的打印
1.字典的创建
a.方法一
dict={key1:value1,key2:value2…}
b.方法二
内置方法:{}.fromkeys()
该方法是将一个列表的值作为key值,并给每个key赋相同的value值,默认为None
names=['anan','liukai','sushe']
dict={}.fromkeys(names)
print(dict)
dict1={}.fromkeys(['haha','liuzaishi'],'runningman')
print(dict1)
结果
{'anan': None, 'liukai': None, 'sushe': None}
{'haha': 'runningman', 'liuzaishi': 'runningman'}
c.方法三
通过zip简介创建
info=zip(['name','root'],['passwd','123'])
dict4=dict(info)
list=list(info)
print(dict4)
print(list)
结果
{'name': 'passwd', 'root': '123'}
[]
由运行结果可知,zip转换后的变量改变了原来的id,所以不可以再进行转换
d.方法四
采用dict值传递
dict6=dict(name='root',passwd=123)
print(dict6)
结果
{'name': 'root', 'passwd': 123}
小案例:创建卡号格式为612345xxx的100张连号银行卡,密码均为123456
cards=[]
for count in range(100):
num='%.3d'%(count+1)
card='612345'+str(num)
cards.append(card)
dict={}.fromkeys(cards,'123456')
print(dict)
结果太多,不放了
2.字典的内建方法
(1)查看
字典的索引
通过key获取对应的value值
dict(key1)
若有对应的key值,则返回,若没有,则报错
通过get获取对应的value值
divt.get(key1,‘1’)
若有对应的key,返回对应的value值,若没有,返回’1’,不指定时返回默认值None
查看字典中所有的key、value、key-value
dict.keys()
dict.values(0
dict.items()
字典的for循环
for循环字典时,默认遍历key值
for key in dict:
可以循环整个字典
for key,value in dict.items():
(2)增加
根据key值增加
dict[‘key’]=[11]
如果key存在,则修改key-value
若不存在,则增加key-value
dict.setdefault()
dict.)setdefault(‘key’,11)
如果key存在,则不做改变
如果不存在,则增加
dict.update(dict2)
update只能增加另一个字典
从而达到增加多个键值对的目的,也可以是只有一个键值对的字典
(3)删除
del dict[key]
删除指定的key及其对应的value值
如果key存在,删除对应的value值
如果key不存在,报错
pop(key,‘默认’)
返回指定的key对应的value值
如果key存在,删除对应的value值
如果key不存在,若没有指定默认值,报错
popitem()
随机删除key-value
返回key-value
(4)循环遍历字典
字典遍历时,默认遍历的是字典的key值,
student = {
'user1':[100,100,100],
'user2':[100,90,80],
'user3':[90,100,100]
}
for i in student:
print(i)
for i,j in student.items():
print(i,j)
结果
user1
user2
user3
user1 [100, 100, 100]
user2 [100, 90, 80]
user3 [90, 100, 100]
3.字典的案例
词频统计
from collections import Counter
text="""
hello word hello python python python python python python hello java hello php hello python
happy every day happy happy happy
"""
dict={}
for i in text:
if i in dict:
dict[i] += 1
else:
dict[i]=1
print(dict)
counter=Counter(dict)
print(counter)
结果
{'\n': 3, 'h': 17, 'e': 7, 'l': 10, 'o': 13, ' ': 19, 'w': 1, 'r': 2, 'd': 2, 'p': 17, 'y': 13, 't': 7, 'n': 7, 'j': 1, 'a': 7, 'v': 2}
Counter({' ': 19, 'h': 17, 'p': 17, 'o': 13, 'y': 13, 'l': 10, 'e': 7, 't': 7, 'n': 7, 'a': 7, '\n': 3, 'r': 2, 'd': 2, 'v': 2, 'w': 1, 'j': 1})
Counter()根据key值出现次数排序
4.defaultdict()
collections.defaultdict类,提供默认值的功能,默认值可以是整型、列表、集合等
dict中:如果程序根据不存在的key值访问value,会引发keyerror异常
defaultdict中:如果访问的key值不存在,自动生成默认的value
举例
from collections import defaultdict
info=defaultdict(int)
print(info['a'])
info=defaultdict(list)
print(info['a'])
info=defaultdict(set)
print(info['a'])
结果
0
[]
set()