Day7 python基础

一,集合

       集合时无序的,不重复的数据集合,它里面的元素时可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的。以下是集合最重要的两点:

  1.去重:把一个列表变成集合,就自动去重了。

  2.关系测试:测试两组数据之前的交集,差集,并集等关系

 

1.集合的创建:

#第一种:
set1 = {'alex', 'wusir'}
#第二种
set2 = set({'alex', 'wusir'})

2.集合的增删:

#增
set1 = {'alex','wusir','ritian','egon','barry'}
set1.add('女神')
print(set1)

set1.updata('abc')  #相当于extend,迭代增
print(set1)
#
set1.remove('alex')   #根据元素删除,若需要删除的元素不存在,则报错
print(set1)

set1.pop()  #随机删除一个元素,返回被删除元素,若集合为空则报错
print(set1)

set1.clear()  #清空集合
print(set1)

del set1    #从内存级别上删除集合
print(set1)

3.集合的关系测试

set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
# 交集
print(set1 & set2)
print(set1.intersection(set2))

# 并集
print(set1 | set2)
print(set1.union(set2))

# 反交集

print(set1 ^ set2)
print(set1.symmetric_difference(set2))

# 差集
set1 = {1,2,3,4,5}
set2 = {4,5,6,7,8}
 print(set1 - set2)
 print(set1.difference(set2))

set1 = {1,2,3}
set2 = {1,2,3,4,5,6}
# 子集
print(set1 < set2)  # True
print(set1.issubset(set2))

# 超集
print(set2 > set1)
print(set2.issuperset(set1))

集合转换为不可变数据类型:

#冻集合
set1 = {1,2,3}
set3 = frozenset(set1)
print(set3) # 不可变的数据类型。 ***

常见的集合面试题:

# 面试题:list去重  *****
l1 = [1,1,2,3,4,4,5,6,7,8]
set1 = set(l1)
l2 = list(set1)
print(l2)

二,深浅拷贝

# 赋值运算
l1 = [1,2,3]
l2 = l1     #l2,l1指向的内存地址一样
l1.append(666)
print(l2)
print(id(l1))  
print(id(l2))

浅拷贝:第一 层在内存中是独立的,从第二层开始以及更深的层数,都是使用同一个

l1 = [1,2,3]
l2 = l1.copy()
l1.append(666)
print(l2)
l1 = [1,2,3,[22,]]
l2 = l1.copy()
l1[-1].append('taibai')
print(id(l1))
print(id(l2))
print(id(l1[-1]))
print(id(l2[-1]))

深拷贝:完全独立互不影响

import copy
l1 = [1,2,3,[22,]]
l2 = copy.deepcopy(l1)
l1[-1].append('太白')
print(l2)

应用场景:

  浅copy:如果一份数据(列表)第二层时,你想与原数据进行公用

  深copy:完全独立的copy一份数据,与原数据没有关系。

 

常见的深浅拷贝面试题:

1.解释深浅copy

2.切片是属于深copy还是浅copy

# 切片属于浅copy
l1 = [1,2,3,[22,33]]
l2 = l1[:]
l1.append(666)
l1[-1].append(666)
print(l2)

 

 

三,基础数据类型的补充知识

# 元组
# 如果元组中只有一个数据,且没有逗号,则该 '元组' 与里面的数据的数据类型相同。 tu1 = (1,) tu2 = ('alex') #str字符型 tu3 = ([1,2,3],) print(tu1,type(tu1)) print(tu2,type(tu2)) print(tu3,type(tu3))
# 列表

# 列表与列表可以相加
l1 = [1,2,3]
l2 = ['alex','wusir']
l3 = l1 + l2
print(l3)

# 在循环一个列表时,如果对列表中的某些元素进行删除,那么此元素后面的所有元素就会向前进一位,他们的索引就会发生变化。
# 在循环一个列表时,最好不要对此列表进行改变大小(增删)的操作。

例:将列表中索引为奇数的元素,全部删除
l1 = [11, 22, 33, 44, 55, 66, 77, 88]
# 方法一:切片+步长删除
del l1[1::2]
print(l1)

#方法二:
l2 = []
for i in range(len(l1)):
    if i % 2 == 0:
        l2.append(l1[i])
print(l2)
l1 = l2
print(l1)

# 方法三:倒着删除
for index in range(len(l1)-1, -1, -1):
    if index % 2 == 1:
        l1.pop(index)
print(l1)
# 字典

# fromkeys()
# dic1 = dict.fromkeys([1,2,3],'alex')
# print(dic1)

常见的字典面试题:

描述创建字典的几种方式

#第一种
dic = {'name':'alex'}
#第二种
dic = dict({'name':'alex'})
print(dic)
#第三种
使用romkeys()函数创建一个字典

字典 fromkeys函数的陷阱

# 陷阱:
dic1 = dict.fromkeys([1,2,3],[])
print(dic1)
dic1[1].append('alex')
print(dic1)
print(id(dic1[1]))
print(id(dic1[2]))
print(id(dic1[3]))
# dictionary changed size during iteration: 在循环一个字典时,不能改变字典的大小

例:将 dic的键中含有k元素的所有键值对删除。
dic = {'key1': 'value1','key2': 'value2', 'k3':'v3', 'name': 'alex'}
l1 = []
for key in dic:
    if 'k' in key:
        l1.append(key)
print(l1)
for key in l1:
    dic.pop(key)
print(dic)

#错误示范
# for key in dic:
#     if 'k' in key:
#         dic.pop(key)

数据类型的转换

#str与list互相转换

# str ---> list
s1 = 'alex wusir taibai'
l1 = s1.split()
print(l1)

# list  ---> str  此list中的元素全部是str类型,否则报错
l1 = ['alex', 'wusir', 'taibai']
s2 = ' '.join(l1)
print(s2)
#tuple与list互相转换

# tuple <--- list
l1 = [1,2,3]
tu1 = tuple(l1)
print(tu1)

# tuple ---> list
tu2 = (0,2,3)
l1 = list(tu2)
print(l1)
#str与bytes互相转换

编码:encode
str --->bytes
s1 = 'alex'
b1 = s1.encode('utf-8')

解码:decode
bytes ---> str
s2 = b1.decode('utf-8')  #s2为unicode编码
#字典转换为列表
#dict.keys() dict.values() dict.items()  list()

dic1 = {'name': 'alex', 'age': 1000}
l1 = list(dic1)
print(l1)
#布尔值为False的数据类型
int型:0
str型:''         #空字符
list型:[]        #空列表
dict型:{}      #空字典
tuple型:()       #空元组
set型:set()    #空集合

 

posted @ 2018-08-10 18:03  乘地铁  阅读(196)  评论(0编辑  收藏  举报