编辑
2024-04-06
面试题
00
请注意,本文编写于 442 天前,最后修改于 442 天前,其中某些信息可能已经过时。

目录

1、现有字典 d= {'a':24,'g':52,'i':12,'k':33}请按value值进行排序?
2、字典推导式
3、反转字符串
4、将字符串 "k:1 |k1:2|k2:3|k3:4",处理成字典 {k:1,k1:2,...}
5、请按alist中元素的age由大到小排序
6、下面代码的输出结果将是什么?
7、写一个列表生成式,产生一个公差为11的等差数列
8、给定两个列表,怎么找出他们相同的元素和不同的元素?
9、请写出一段python代码实现删除list里面的重复元素?

基础部分:数据类型

1、现有字典 d= {'a':24,'g':52,'i':12,'k':33}请按value值进行排序?

python
# -*- coding: utf-8 -*-# # ------------------------------------------------------------------------------- # Name: 5、现有字典 d= {'a':24,'g':52,'i':12,'k':33}请按value值进行排序? # Description: # Author: zhaoyaowei # Date: 2023/3/12 20:52 # ------------------------------------------------------------------------------- from operator import itemgetter d = {'a': 24, 'g': 52, 'i': 12, 'k': 33} new_list = sorted(d.items(), key=lambda x: x[1]) # d.iteritems() 在3.x中已废弃; # itemgetter函数获取的不是值,而是定义了一个函数,通过该函数作用到对象上才能获取值 new_list1 = sorted(d.items(), key=itemgetter(1)) print(new_list1) # 附录 """ (1)字典常见用法: dict.keys():以列表返回一个字典所有的键。 dict.values():以列表返回字典中的所有值。 dict.items():以列表返回可遍历的(键, 值) 元组数组。 (2)sorted() -全局性的Python内置函数,可对所有可迭代类型进行排序,返回新list,原有列表不变 原型:sorted(iterable, cmp=None, key=None, reverse=False),cmp比较函数在3.x已取消 用法和sort()类似 sort() -一般是列表的Python内置函数,返回None,直接修改原有列表 原型:sort(fun,key,reverse=False),fun一般是归并算法,可忽略;key可指定一个函数 list1 = [(2,'zhao',23),(12,'yao',14),(23,'wei',90)] list1.sort() --默认key排序,即按照元组中第一个元素进行排序 list1.sort(key=lambda x:(x[1])) --使用匿名表达式重写key函数排序 list1.sort(key=lambda x:(x[2],x[0])) --先按照下标2排序,下标2相同,则按照下标0 list1.sort(key=itemgetter(1)) --使用operator模块中的itemgetter函数 list1.sort(key=itemgetter(2,0)) --类比lambda中的排序方法 补充: a.字典中混合list排序: 根据mydict的value结构[n,m]中的m按照从小到大的顺序排列 mydict = { 'Li' : ['M',7], 'Zhang': ['E',2], 'Wang' : ['P',3], 'Du' : ['C',2], 'Ma' : ['C',9], 'Zhe' : ['H',7] } sorted(mydict.iteritems(), key=lambda (k,v): operator.itemgetter(1)(v)) b.列表中混合dict排序:针对list中的字典元素按照rating和name进行排序的实现方法 >>> game_result = [ { "name":"Bob", "wins":10, "losses":3, "rating":75.00 }, { "name":"David", "wins":3, "losses":5, "rating":57.00 }, { "name":"Carol", "wins":4, "losses":5, "rating":57.00 }, { "name":"Patty", "wins":9, "losses":3, "rating": 71.48 }] sorted(game_result , key=operator.itemgetter("rating","name")) (3)扩展:Python的4种排序算法 https://zhuanlan.zhihu.com/p/383453416 参考资料:https://blog.51cto.com/u_14246112/3141437 """

2、字典推导式

python
# -*- coding: utf-8 -*-# # ------------------------------------------------------------------------------- # Name: 6_字典推导式 # Description: 推导式(Compression)也叫解析式,可以从一个数据序列构建另一个新的数据序列的结构体。 # Author: zhaoyaowei # Date: 2023/3/14 22:04 # ------------------------------------------------------------------------------- iterable = {} d = {key: value for (key, value) in iterable} # 附录: 1、列表推导式 """ 语法:new_list = [表达式 for 变量 in 可迭代对象 if 条件 == True] 或者 [ 表达式(可含变量1和变量2) for 变量1 in 可迭代对象1 for 变量2 in 可迭代对象2 ...] 示例1:求(x, y),其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表 [(x,y) for x in range(5) if x%2==0 for y in range(5) if y%2==1] # [(0, 1), (0, 3), (2, 1), (2, 3), (4, 1), (4, 3)] 示例2:求M中3, 6, 9组成的列表 M = [[1,2,3], [4,5,6], [7,8,9]] [row[2] for row in M] # [3, 6, 9] # 或者用下面的方式 [M[row][2] for row in (0, 1, 2)] # [3, 6, 9] 示例3:过滤掉长度小于等于3的字符串列表,并将剩下的转换成大写字母 names = ['Bob','Tom','alice','Jerry','Wendy','Smith'] [name.upper() for name in names if len(name)>3] # ['ALICE', 'JERRY', 'WENDY', 'SMITH'] 示例4:生成间隔5分钟的时间列表序列 ["%02d:%02d"%(h,m) for h in range(0, 24) for m in range(0, 60, 5)] 示例5:复杂点的列表推导式 # in后面跟其他可迭代对象,如字符串 list_c = [7 * c for c in "python"] # ['ppppppp', 'yyyyyyy', 'ttttttt', 'hhhhhhh', 'ooooooo', 'nnnnnnn'] # 带if条件语句的列表推导式 list_d = [d for d in range(6) if d % 2 != 0] # [1, 3, 5] # 多个for循环 list_e = [(e, f * f) for e in range(3) for f in range(5, 15, 5)] # [(0, 25), (0, 100), (1, 25), (1, 100), (2, 25), (2, 100)] # 嵌套列表推导式,多个并列条件 list_g = [[x for x in range(g - 3, g)] for g in range(22) if g % 3 == 0 and g != 0] # [[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11], [12, 13, 14], [15, 16, 17], [18, 19, 20] # 三变量列表推导式 List6=[(x,y) for x in range(-2,2) for y in [0,1]] List7=[x+y+z for x in range(-2,2) for y in range(3) for z in [0,1]] # [(-2, 0), (-2, 1), (-1, 0), (-1, 1), (0, 0), (0, 1), (1, 0), (1, 1)] # [-2, -1, -1, 0, 0, 1, -1, 0, 0, 1, 1, 2, 0, 1, 1, 2, 2, 3, 1, 2, 2, 3, 3, 4] 示例6:生成generator, 只需要将列表推导式的[]改成()即可得到生成器; multiples = (i for i in range(30) if i%3 == 0) print(type(multiples)) # <type 'generator'>,返回值类型是generator print(list(multiples)) # 输出列表 """ # 附录: 2、字典推导式 """ 语法:new_dict = { 键表达式 : 值表达式 for 变量 in 可迭代对象 if 条件 == True } 或者 { 键表达式 : 值表达式 for 变量1 in 可迭代对象1 for 变量2 in 可迭代对象2 ...} 用法与列表推导式基本类似 1、在字典中提取或者修改数据,返回新的字典 # 示例1:获取字典中key值是小写字母的键值对 dict1 = {"a":10,"B":20,"C":True,"D":"hello world","e":"python教程"} dict2 = {key:value for key,value in dict1.items() if key.islower()} # {'a': 10, 'e': 'python教程'} # 示例2:将字典中的所有key设置为小写 dict3 = {key.lower():value for key,value in dict1.items() } # {'a': 10, 'b': 20, 'c': True, 'd': 'hello world', 'e': 'python教程'} # 示例3:将字典中所有key是小写字母的value统一赋值为'error' dict4 = {key:value if key.isupper() else "error" for key,value in dict1.items() } # {'a': 'error', 'B': 20, 'C': True, 'D': 'hello world', 'e': 'error'} 2、在字符串中提取数据,返回新的字典 cookies = "anonymid=jy0ui55o-u6f6zd; depovince=GW; _r01_=1" cookies = {cookie.split("=")[0]:cookie.split("=")[1] for cookie in cookies.split("; ")} # {'anonymid': 'jy0ui55o-u6f6zd', 'depovince': 'GW', '_r01_': '1'} """ # 附录: 3、集合推导式 """ 语法:new_set = { 表达式 for 变量 in 可迭代对象 if 条件 == True } 其形式和用法与列表推导式基本一致,二者区别在于 a. 不使用中括号,使用大括号 b. 返回值类型是一个set(集合) c. 结果中无重复元素 集合推导式与字典推导式相同, 可根据表达式进行区分。以键值对(key:value)的形式,是字典推导式。 总之,集合推导式就是将列表推导式的[]换成{},字典推导式就是推导出两个值并构建成键值对的样子。 """ # 附录: 4、元组推导式==生成器 """ 语法:new_generator = (表达式 for 变量 in 可迭代对象 if 条件 == True) 与列表推导式的用法完全相同,但使用元组推导式生成的结果并不是一个元组,而是一个生成器对象。 获取新元组及其元素: 方法一:使用tuple()函数,new_tuple= tuple(new_generator) 方法二:使用 for循环遍历生成器对象: for i in new_generator == () 方法三:使用next() 方法遍历生成器对象 new_generator.__next__() == () 备注:__next__()是生成器对象的实例方法,next(new_generator)是python的内置方法,均可 方法二和三,遍历后原生成器对象将不复存在 """

3、反转字符串

python
# -*- coding: utf-8 -*-# # ------------------------------------------------------------------------------- # Name: 7_反转字符串 # Description: 请反转字符串 "AaBbCcDdEeFf" # Author: zhaoyaowei # Date: 2023/3/20 23:21 # ------------------------------------------------------------------------------- from functools import reduce s = "AaBbCcDdEeFf" # 分析 """ Python 提供了两种直接的方法来反转字符串。 由于字符串是序列,且不可变,因此它们是indexable、sliceable和iterable。 所以可使用切片以相反的顺序直接生成给定字符串的副本。 第二个方法是使用内置函数reversed()创建一个迭代器, 该迭代器以相反的顺序生成输入字符串的字符。 """ # 方法一: 通过切片反转字段串或slice()内置函数模拟切片 # s_string[start:stop:step] 默认值分别是0, len(s_string), 1;step=-1时,从右往左切片。 print(s[::-1]) print(s[slice(None, None, -1)]) # 方法二:使用.join()和反转字符串reversed() # reversed(序列=tuple, string, list 或 range)返回一个反转的迭代器,直接作为参数传递给.join() a = (1, 2, 3) print(reversed(a)) # <reversed object at 0x1059ee100>,next()、__next__() print(list(reversed(a))) # [3, 2, 1] print("".join(reversed(s))) # fFeEdDcCbBaA # 方法三:for循环或者while和连接运算法+ # 因字符串不可变,多次创建新字符串,于下次迭代中弃用,此法过于浪费 new_s = "" for i in s: new_s = i + new_s # 不是 new_s = new_s + i print(new_s) # fFeEdDcCbBaA new_s1 = "" index = 0 while index < len(s): new_s1 = s[index] + new_s1 index += 1 print(new_s1) # fFeEdDcCbBaA # 方法四:使用递归反转字符串 # 需注意,此方法,字符串长度不可超过1000,否则会报错RecursionError # sys.getrecursionlimit() = 1000,setrecursionlimit()重新设值 def reverse_str(text): if len(text) == 1: return text # 字符串切换,依次递归所有text, 与第一个字符串相加,text[:1] return reverse_str(text[1:]) + text[0] # 方法五:使用reduce()扭转字符串 # 每次遍历s中的2个参数,入参lambda,并将两个字符串以反序连接,最终返回新的字符串值 new_s = reduce(lambda x, y: y + x, s)

4、将字符串 "k:1 |k1:2|k2:3|k3:4",处理成字典 {k:1,k1:2,...}

python
# -*- coding: utf-8 -*-# # ------------------------------------------------------------------------------- # Name: 8_将字符串 "k:1 |k1:2|k2:3|k3:4",处理成字典 {k:1,k1:2,...} # Description: # Author: zhaoyaowei # Date: 2023/3/22 00:01 # ------------------------------------------------------------------------------- s = "k:1 |k1:2|k2:3|k3:4" # 方法一:字典推导式 d1 = {k: int(v) for i in s.strip().split("|") for k, v in (i.split(":"),)} # for循环 d2 = {} for i in s.strip().split("|"): k, v = i.split(":") d2[k] = int(v) print(d1, d2)

5、请按alist中元素的age由大到小排序

python
# -*- coding: utf-8 -*-# # ------------------------------------------------------------------------------- # Name: 9_请按alist中元素的age由大到小排序 # Description: alist = [{'name':'a','age':20},{'name':'b','age':30},{'name':'c','age':25}] # Author: zhaoyaowei # Date: 2023/3/25 17:18 # ------------------------------------------------------------------------------- alist = [{'name': 'a', 'age': 20}, {'name': 'b', 'age': 30}, {'name': 'c', 'age': 25}] # 方法一: # 参考第5题 result_list = sorted(alist, key=lambda x: x["age"], reverse=True) # 方法二: # sort() 函数的key参数用来指定排序时使用的比较规则, # 这里使用 lambda 表达式 key=lambda x:x['age'] 来指定按照字典元素的 age 值进行排序。 # 因为需要按从大到小排序,所以 reverse 参数设为 True。整个排序过程是在原来alist数据结构上进行的, # 所以排序结果会直接反映在alist列表中。 alist.sort(key=lambda x: x['age'], reverse=True) print(result_list, alist)

6、下面代码的输出结果将是什么?

python
# -*- coding: utf-8 -*-# # ------------------------------------------------------------------------------- # Name: 10_下面代码的输出结果将是什么? # Description: # Author: zhaoyaowei # Date: 2023/3/25 17:38 # ------------------------------------------------------------------------------- lst = ['a', 'b', 'c', 'd', 'e'] print(lst[10:]) # [] print(lst[10]) # IndexError: list index out of range # 切片时,是对原始列表进行切片复制,超出范围,则为空,不会报错。切片时是对list进行浅拷贝 # 但是注意:当访问索引超出其长度的列表中元素时,无法返回值且报下标越界错误

7、写一个列表生成式,产生一个公差为11的等差数列

python
# -*- coding: utf-8 -*-# # ------------------------------------------------------------------------------- # Name: 11_写一个列表生成式,产生一个公差为11的等差数列 # Description: # Author: zhaoyaowei # Date: 2023/3/25 18:21 # ------------------------------------------------------------------------------- lst1 = [i*11 for i in range(10)] lst2 = [i for i in range(0, 100, 11)] print(lst1, lst2)

8、给定两个列表,怎么找出他们相同的元素和不同的元素?

python
# -*- coding: utf-8 -*-# # ------------------------------------------------------------------------------- # Name: 12_给定两个列表,怎么找出他们相同的元素和不同的元素? # Description: list1 = [1,2,3] list2 = [3,4,5] # Author: zhaoyaowei # Date: 2023/3/25 18:28 # ------------------------------------------------------------------------------- list1 = [1, 2, 3] list2 = [3, 4, 5] # 方法一:集合(set) set1 = set(list1) set2 = set(list2) print(set1 & set2) # 交集 {3} 在 set1 和 set2 中 print(set1 ^ set2) # 补集 {1, 2, 4, 5} 在 set1 或 set2 中,但不同时在 print(set1 | set2) # 并集 {1, 2, 3, 4, 5} 在 set1 或 set2 中 print(set1 - set2) # 差集 {1, 2} 在 set1 中,但不在 set2 中 # 方法二:列表推导式 common_list = [i for i in list1 if i in list2] different_list = [i for i in list1 + list2 if i not in common_list] print(common_list) print(different_list)

9、请写出一段python代码实现删除list里面的重复元素?

python
# -*- coding: utf-8 -*-# # ------------------------------------------------------------------------------- # Name: 13_请写出一段python代码实现删除list里面的重复元素? # Description: l1 = ['b','c','d','c','a','a'] # Author: zhaoyaowei # Date: 2023/3/25 19:01 # ------------------------------------------------------------------------------- l1 = ['b', 'c', 'd', 'c', 'a', 'a'] # 方法一:集合(set) print(list(set(l1))) # 方法二:for循环 l2 = [] for i in l1: if i not in l2: l2.append(i) print(l2)
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:赵耀伟

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!