python面试100讲 第二章(列表,元组和字典)

第二章: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字符串转换为字典。

发布了65 篇原创文章 · 获赞 50 · 访问量 3587

猜你喜欢

转载自blog.csdn.net/qq_44907926/article/details/104384762