学习笔记:Python 面试100讲(基于Python3.x)02-列表、元组和字典

01-去掉列表或者元组中重复的元素

一 在python中如何定义集合,集合与列表有何区别
二 如何去掉列表(元组)中重复的元素

答
一
a = [1,2,3] #列表
b = (1,2,3) #元组
c = {1,2,3} #集合

集合和列表区别:
1.列表可以有重复元素,集合没有重复元素
2.集合中的元素和顺序无关,列表中的元素和顺序有关

二
把列表(元组)转换成集合,再转换回去
例如:
a = [1,3,3,3,4]
b = list(set(a))

02-集合的并集与交集

一 如何向集合中添加或者删除元素,需要注意什么
二 如何求集合之间的并、交,集合之间还有什么操作

答:
一
1.添加是add()函数,删除是remove()函数
例如:x={1,3,4,5}
x.add(2)
x.remove(1)
2.进行删除操作时要先判断在集合里存不存在这个元素
例如:
if x.__contains__(1):
    x.remove(1)
else:
    pass

二
1.并集:x1 | x2 或者 x1.union(x2)
  交集:x1 & x2 或者 x1.intersection(x2)
2.x1.difference(x2) #x1中有,而x2中没有的
  x1 ^ x2   #刨除x1和x2共有的元素

03-两个列表首尾相接

一 连接两个列表的方式有哪些
二 这些连接方式有什么区别

答:
一
1.直接相加或者使用extend()函数,例如a.extend(b)
    元组首尾相接可以直接相加,但不能用extend

2.加号不会改变原来列表的值,但extend会改变原来列表的值
  加号两边要同样的类型,extend可以连接列表和元组,但是只能元组在后面作为参数

04-乱序列表

一 编写一个函数打乱列表元素
二 如何对列表元素进行随机排列

答:
一
1.
import random

'''
循环一百次,每次都随机互换两个数
'''
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]


def random_list1(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]
    return a


b = random_list1(a)
print(b)

'''
创建一个新的空列表,每次随机选一个出来加进去
'''
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]


def random_list2(a):
    a_copy = a.copy()
    result = []
    for i in range(0, len(a)):
        index = random.randint(0, len(a_copy) - 1)
        result.append(a_copy[index])
        del a_copy[index]
    return result


b = random_list2(a)
print(b)

二
使用random.shuffle()函数
例如
def random_list2(a):
    random.shuffle(a)
    return a

05-单星和双星运算符

一 单星(*)和双星(**)运算符的作用,并举例说明
二 请描述合并列表和合并字典的方法有哪些

答:
一
单星(*):
    1.以元组方式导入
    2.可变参数(参数数量可变)
    3.如果可变参数不是最后一个参数,那么可变参数后面的形参指定参数值,一定要用命名参数
    例如:
    def fun1(param1, *param2,x):
        pass
    fun1(1,2,3,4,6,7,x=8)
双星(**):
    以字典方式导入
    例如:
    def fun2(param1,**param2):
        pass
    dun2(1,a=1,b=2,c=3)

二
星号(*)和双星号(**)也能解引用
例如:
合并a和b
a=[1,2,3]
b=[4,5,6]
c=[*a,*b]

合并A和B
A={'A':1,'B':2}
B={'C':3,'D':4}
C={**A,**B}

06-快速调换字典中的key和value

一 如何快速调换字典中的key和value
二 如何循环快速生成一个从0到100的列表

答:
一
D={'A':1,'B':2}
E={v:k for k,v in D}

二
A=[i for i in range(0,101)]

07-将两个列表(元组)合并成一个字典

一 如何将下面两个列表合并成一个字典
    a = ["a","b"]
    b = [1,2]
    合并后:{"a":1,"b":2}

答:
一
用zip和dict函数(先用zip压缩,接着用dict转换成字典)
例如 dict(zip(a,b))

假如:
    c = [[1,2],[3,4]]
    可以用循环先把每一维的列表合并成字典,然后append进一个列表里
    例如:
c = [[1, 2], [3, 4]]
a = ["a", "b"]
r = []
for li in c:
    d = dict(zip(a, li))
    r.append(d)
print(r)

08-列表和元组区别

一 请详细描述列表和元组的区别

答:
一
1.语法差异
    a = (1,2,3,4)   #元组
    b = [1,2,3,4]   #列表

2.元组是只读的,列表是可读写的

3.拷贝出来副本的性质不一样(使用tuple函数后,元组仍然为自身;使用list函数后,会复制一个新列表)
copy_a = tuple(a)
copy_b = list(b)
print(copy_a is a)  #True
print(copy_b is b)  #False
4.大小不一样,元组比较小,因为元组使用比较大的内存块,当元素比较多时,元组速度更快
print(a.__sizeof__())
print(b.__sizeof__())

09-如何排序一个列表

一 对列表排序有几种方法
二 列表的sort方法和sorted函数都可以对列表进行排序,他们有什么区别
三 如何倒序排列一个列表

答:
一
可以用列表自带的sort方法,也可以用sorted函数

二
sort方法是改变列表自身,sorted函数并不会改变列表本身,返回一个列表副本


三
降序排列(把sort方法和sorted函数的reverse属性改为true就可以了)
例如:
    a.sort(reverse=true)
    sorted(a, reverse=true)

10-列表元素是对象,该怎么进行排序

一 如果列表元素是对象,对这样的列表排序有什么方法
二 如果列表元素是对象,对这样的列表进行倒序排列的方法有哪些

答:
1.类的magic方法
2.operator模块
3.sort方法和sorted函数

一
1.相关magic方法有__lt__,__gt___,前期太乱就只记__lt__用法吧
class myClass:
    def __init__(self, value):
        self.value = value

    def __lt__(self, other):
        return other.value > self.value
#当满足__lt__函数的条件,使用sort方法,或者sorted函数排序时,当前类在左边,不满足magic函数时当前类在右边
#当满足__gt__函数的条件,使用sort方法,或者sorted函数排序时,当前类在右边,不满足magic函数时当前类在左边
2.使用operator函数
例如:
    import operator
    a.sort(key=operator.attrgetter("value")    #参数要加双引号
    或者sorted(a,key=operator.attrgetter("value")

二
1.magic方法
def __lt__(self, other):
    return self.value > other.value

2.operater方法
import operater
a.sort(key=operater.attrgetter("value"),reverse=True)

11-del和pop的区别

一 del和pop都可以用来删除列表元素,他们有什么区别

答:
del 根据索引删除元素,并且没有返回值
    del a[2]
pop 根据索引弹出列表元素,返回并删除该元素,
    a.pop(2)
    a.pop()  #没有指定参数时弹出列表最后一个

12-用lambda函数对列表进行排序

一 如果列表元素是字典,如何使用lambda表达式对列表进行升序降序排列

答:
一
a = [
    {"name": "Mike", "age": 112},
    {"name": "Jack", "age": 23}
]
print(sorted(a, key=lambda x: x["age"])) #降序后面加reverse

13-字典键值支持的数据类型

一 有哪些键值不能作为字典键值的数据类型
二 为什么列表和字典类型的值不能作为字典的键值

答:
一 列表和字典不能作为字典键值

二 因为字典的键值key是不能变的

14-对产生器类型的对象使用切片

一 如何使用切片获取产生器类型对象中的部分元素

答:
一
其实不是很懂什么叫生成器,反正就是理解成存放大量数据时列表很耗空间,用生成器可以节省空间

回到题目,itertools模块中的islice函数可以使用分片获取产生器类型对象中的部分元素
islice函数的第一个参数是产生器,第二个参数是开始索引,第三个参数是结束索引下一个元素的索引
    from itertools import islice
    gen = iter(range(10))
    print type(gen)
    for i in islice(gen,2,6):
    print(i)

15-将循环参数的列表变成产生器

一 如何将【i for i in range(10)]变成产生器

答:
把方括号改为括号就好了,(i for i in range(10))
注意里面要有for,不然就变成元组了

16-python字典和json字符串怎么互换

一 python字典和json字符串如何互转

答:
字典转json:
    import json
    json_str=json,dumps(d)
json转字典:
    import json
    d = json.loads(json_str)

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值