基础部分:数据类型
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
"""
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的内置方法,均可
方法二和三,遍历后原生成器对象将不复存在
"""
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)
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)
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)
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进行浅拷贝
# 但是注意:当访问索引超出其长度的列表中元素时,无法返回值且报下标越界错误
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)
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)
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)
本文作者:赵耀伟
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!