第二章:Python面试必考重点:列表,元组和字典
#第一题:1.列表和集合的相关知识
2.列表与集合之间的转换
面试题1:在python中如何定义集合,集合与列表有什么区别
面试题2:如何去掉列表(元组)中重复的元素
面试题1:
a = [1,2,3,4,5] # 列表
b = (1,2,3,4,5) # 元组
c = {1,2,3,4,5} #集合
区别:
1.集合没有重复的元素,而列表可以有重复的元素。
2.集合中的元素与顺序无关,而列表中的元素与顺序有关
面试题2:
a = [1,2,2,3,4,3] # 或者元组
a_result = list(set(a))
print(a_result)
#####################################################
第二题:1.集合的基础操作
2.集合之间的运算
面试题1:如何向集合中添加和删除元素,需要注意什么
面试题2:如何求集合的并,交,集合之间是否还支持其他操作
面试题1:
x = {3,2,1}
x.add(123) #如果添加重复的会忽略,不会添加
if x.__contains__(444): #判断集合x中是否含有元素444
x.remove(123) #如果删除元素不存在就会抛出异常
else:
print('444在集合中不存在')
面试题2:
x1 = {1,2,3}
x2 = {3,4,5}
print(x1 | x2) #集合之间的合并 或者:print(x1.union(x2))
print(x1 & x2) #相交 或者print(x1.intersection(x2))
print(x1.difference(x2)) # 输出为:{1,2}
#将x1有的,x2中也有的删除,返回的是x1的子集
print(x1 ^ x2) # 输出为:{1,2,4,5}
#刨除x1和x2共有的元素,返回的是集合并的子集
##############################################
第三题:1.列表和元组的连接方式
2.这些方式有什么区别
面试题1:连接两个列表的方式有哪些
面试题2:这些连接方式有什么区别
面试题1:
a = [1,5,7,9,6]
b = [2,3,3,6,8]
(1)元组也一样
print(a + b)
(2)元组不可
a.extend(b)
print(a)
面试题2:
差异:
1.+ 不改变参与连接的列表的值,但extend方法可以改变a列表的值
2.+ 两侧要么都是元组,要么都是列表。但是列表的extedn方法可以将一个元组添加到列表
#######################################################
第四题:1.手工打乱列表元素的顺序
2.随机排列API
面试题1:编写一个函数(不要使用python模块的函数),打乱列表元素的顺序
面试题2:如何对列表元素进行随机排列
面试题1:
#(1)
a = [1,2,3,4,5,6,7,8,9,0]
import random
def random_list(a):
for i in range(0,100):
index1 = random.randint(0,len(a) - 1) #这个方法是闭区间,包含两头
index2 = random.randint(0,len(a) - 1)
a[index1],a[index2] = a[index2],a[index1]
b = random_list(a)
print(b)
#(2)
def random_list2(a):
a_copy = a.copy()
result = []
count = len(a)
for i in range(0,count):
index = random.randint(o, len(a_copy) - 1)
result.append(a_copy[index])
del a_copy[index]
return result
a = [1,2,3,4,5,6,7,8,9,0]
b = random_list2(a)
print(b)
面试题2:
import random
a = [1,2,3,4,5,6,7,8,9,0]
random.shuffle(a)
print(a)
###########################################################
第五题:1.单星运算符
2.双星运算符
面试题1:单星()和双星()运算符的作用,请举例说明
面试题2:请描述合并列表和字典的方法有哪些
面试题1:
#单星:
#以元组形式导入
#可变参数
def fun1(param1,*param2):
print(param1)
print(param2,type(param2))
fun1(1,2,3,4,5)
#输出为:
#1
#2,3,4,5)
#双星
#以字典形式导入
def fun2(param1,**param2):
print(param1)
print(param2)
fun2(1,a = 2,b = 3,c = 6)
#输出为:
#1
#{'a': 2, 'b': 3, 'c': 6}
面试题2:
#列表:
a = [1,2,3]
b = [4,5,6]
#(1)
c = a + b
#(2)
a.extend(b)
#(3)
X = [*a,*b]
print(X) #输出为:[1,2,3,4,5,6]
#字典:
a = {'A':1,'B':2}
b = {'C':3,'D';4}
C = {**a,**b}
print(C) #输出为:{'A':1,'B':2,'C':3,'D';4}
####################################################
第六题:1.用循环产生列表
2.用循环产生字典
面试题1:如何快速调换字典中的key和value
面试题2:如何用循环快速生成一个从0到100的列表
面试题1:
d = {'a':1,'b':2}
print({v,k for k,v in d.items()})
面试题2:
a = [i for i in range(101)]
print(a)
###################################################
第七题:zip和dict函数的使用
面试题1:如何将两个列表或元组合并成一个字典,形式如下:
a = [“a”,“b”]
b = [1,2]
合并后{‘a’:1,‘b’:2}
面试题1:
a = ["a","b"]
b = [1,2]
print(dict(zip(a,b)))
###################################################
第八题:了解列表和元组的主要区别
面试题1:请详细描述列表与元组的区别,并举例说明
面试题1:
(1):语法差异
a = (1,2,3) # 元组
b = [1,2,3] #列表
(2)元组是只读的,列表是可读写的
b[1] = 3 #可执行
b(1) = 4 #抛出异常
(3)使用tuple函数后,元组仍然为自身,而使用list函数后,会复制一个新列表
copy_a = tuple(a)
print(a is copy_a) # True
copy_b = list(b)
print(b is copy_b) # False
(4)大小不一样,元组占用的空间更小(大的内存块),当元素比较多时,元组速度更快
print(a.__sizeof__())
print(b.__sizeof__())
#####################################################
第九题:1.列表的sort方法
2.sorted函数
面试题1:对列表排序有哪几种方法
面试题2:列表的sort方法和sorted函数都可以对列表进行排序,区别:
面试题3:如何倒序排列一个列表
面试题1:
(1)
a = [6,2,54,8,3,12]
a.sort()
print(a)
(2)
b= [5,2,7,2,4,2]
c = sorted(b)
print(c)
面试题2:
(1)sort属于列表
sorted是独立的函数
(2)sort改变列表本身,sorted返回一个排好序的列表副本
面试题3:
a.sort(reverse = True)
sorted(b,reverse = True)
#####################################################
第十题:1.类的Magic方法
2.operator模块
3.sort方法和sorted函数的key参数
面试题1:如果列表元素是对象,对这样的列表排序有哪些方法
面试题2:如果列表元素是对象,进行倒序排列的方法有哪些
面试题1:
#第一种:
class MyClass:
def __init__(self):
self.value = 0
def __lt__(self,other):
return self.value < other.value
my1 = MyClass()
my1.value = 20
my2 = MyClass()
my2.value = 10
my3 = MyClass()
my3.value = 30
a = [mya,my2,my3]
print(a) #这是要排序的a就是一个对象
a.sort()
print(a[0].value) # 输出为:10
print(a[1].value) # 20
print(a[2].value) # 30
#第二种:
class MyClass:
def __init__(self):
self.value = 0
def __gt__(self,other):
return self.value > other.value
my1 = MyClass()
my1.value = 20
my2 = MyClass()
my2.value = 10
my3 = MyClass()
my3.value = 30
a = [mya,my2,my3]
print(a) #这是要排序的a就是一个对象
a.sort()
print(a[0].value) # 输出为:10
print(a[1].value) # 20
print(a[2].value) # 30
#第三种:
class MyClass:
def __init__(self):
self.value = 0
my1 = MyClass()
my1.value = 20
my2 = MyClass()
my2.value = 10
my3 = MyClass()
my3.value = 30
a = [mya,my2,my3]
print(a) #这是要排序的a就是一个对象
import operator
a.sort(key = operator.attrgetter('value'))
print(a[0].value) # 输出为:10
print(a[1].value) # 20
print(a[2].value) # 30
面试题2:
(1)(2)
把上面两种魔术方法的大于号小于号颠倒
(3)
class MyClass:
def __init__(self):
self.value = 0
my1 = MyClass()
my1.value = 20
my2 = MyClass()
my2.value = 10
my3 = MyClass()
my3.value = 30
a = [mya,my2,my3]
print(a) #这是要排序的a就是一个对象
import operator
a.sort(key = operator.attrgetter('value'),reverse = True)
print(a[0].value)
print(a[1].value)
print(a[2].value)
总结:
为类添加__gt__和__lt__方法,可以让该类的实例支持sort方法和sorted函数
通过改变__gt__和__lt__方法的返回值,或者设置sort方法和sorted函数的reverse参数,可以让列表倒序排列
########################################################
第十一题:1.del的用法
2.pop的用法
面试题1:del和pop都可以用来删除列表元素,那么它们有什么区别呢
面试题1:
a = [4,3,6,5]
print(a)
del a[2]
print(a)
print(a.pop(1))
print(a)
#del 根据索引删除列表元素,但没有返回值
#pop 根据索引弹出列表元素,并返回该元素,同时从列表中删除该元素。
#######################################################
第十一题:lambda表达式的用法
面试题1:如果列表元素是字典序列,如何利用lambda表达式对列表进行升序降序排列。
面试题1:
a = [
{'name':'Bill','age'"40"}
{'name':'Mike','age':12}
{'name':'Johb','age':29}
]
print(a)
print(sorted(a,key = lambda x : x['age']))
#或者:
a.sort(key= lambda x : x['age'],reverse = True)
print(a)
总结:
lambda表达式只有一行代码,并返回该代码的结果。
#####################################################
第十二题:学习字典键值支持的数据类型
面试题1:有哪些数据类型不能作为字典键值的类型
面试题2:为什么列表和字典类型的值不能作为字典的键值
面试题1:
列表和字典本身
d = {}
d[[1,2,3]] = 3 #会报错
d[{‘a’:3}] = 4 #也会报错
说明字典和列表不能作为字典的键
面试题2:
因为键是不可变的。列表和字典的值是可以变化的,一旦变化就再也找不到value了。
#######################################################
第十三题:学习itertools模块中的API
面试题1:我们知道使用分片可以获取列表的部分元素,那么我们如何使用分片获取产生器类型对象中的部分元素呢?
面试题1:
from itertools import islice
gen = iter(range(10))
for i in islice(gen,2,6):
print(i)
总结:
itertools模块中的islice函数可以使用分片获取产生器类型对象中的部分元素。
islice函数的第一个参数是产生器,第二个参数是开始索引,第三个参数是结束索引下一个元素的索引。
######################################################
第十四题:如何从列表变成产生器
面试题1:如何将[i for i in range(20)]变成产生器
面试题1:
a = (i for i in range(10))
print(type(b)) # 现在就是产生器了
#####################################################
第十五题:json模块相关函数的使用
面试题1:python字典与json字符串如何互转
面试题1:
d = {'a':123,'b':'456','c':'xyz'}
import json
json_str = json.dumps(d)
print(type(json_str)) #str类型
d1 = json.loads(json_str)
print(type(d1)) #dict类型
总结:
使用dumps函数可以将字典转化为json字符串,使用loads函数可以将json字符串转换为字典。