06内置函数结构集合与字典

一.集合

集合(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()
发布了36 篇原创文章 · 获赞 0 · 访问量 300

猜你喜欢

转载自blog.csdn.net/ANingL/article/details/103633435