python使用技巧及Pythonic代码
当存在一个列表你需要将列表中的元素转为对应字典时,如何操作?
例如将["a", 1]变成{"a": 1}
data = ["a", 1]
d = {}
d[data[0]] = data[1]
print(d)
上述方法虽然可以但不通用,如果出现多对就很难解决,可以使用将列表嵌套进元组,之后可以读取到对应的k和v。使用字典表达式可以更加方便。
data = ["a", 1]
d = {k: int(v) for k, v in (data,)}
print(d)
python3.7以后,字典默认是有序的,无序使用orderdict进行操作
for - else结构
我们在实际开发中经常会使用到if-else
结构,但python中也存在一个for-else
结构,与之类似的便是try-else
结构,for-else
是在正常走完全部循环后会执行else
中的内容,try-else
则是需要try
正常走完的情况下才能走到else
,因此,for - else
主要适用于循环全部需要执行且之后需要执行相应操作的情况。
当使用序列或者字符串的查找元素索引时,一般有index
和find
两个方法,但这两个有所区别
index | find | |
---|---|---|
元素存在时 | 返回元素的索引位置 | 返回元素的索引位置 |
元素不存在时 | 抛异常 | 返回-1 |
当我们需要生成随机数据时,我们可以使用faker
模块
安装
pip install faker
基本使用
例如下方是随机生成对应的地址数据
from pathlib import Path
from faker import Faker
file_path = Path(__file__).parent.joinpath("test_data.txt")
def generate_random_data(file_path: str):
faker_obj = Faker(locale="zh_CN")
with open(file_path, mode="w", encoding="utf-8") as w_f:
for i in range(1000):
w_f.write("{}{}".format(faker_obj.address(), "\n"))
generate_random_data(file_path)
会生成一个文件,里面包含一千条数据
详细使用方法见faker文档
当需要批量或者递归创建文件夹时,可以有两种方式
1.os.makedirs()
直接传入正常的文件夹,多层级也可以
2.pathlib.Path().mkdir(parent=True)
功能同上
嵌套循环的处理
在实际编码中,避免不了循环的嵌套,一层、两层还好,但当出现多层时,就会显得比较难看,如下:
list_a = [1, 2020, 70]
list_b = [2, 4, 7, 2000]
list_c = [3, 70, 7]
for a in list_a:
for b in list_b:
for c in list_c:
if a + b + c == 2077:
print(a, b, c)
# 70 2000 7
针对上述的情况,我们可以使用itertools的product方法进行简化,效果是一致的。
for a, b, c in product(list_a, list_b, list_c):
if a + b + c == 2077:
print(a, b, c)
当出现多个and或者多个or的处理
当出现多个and时,我们一般会将and连在一起,如下:
a = 1
b = 2
c = False
if a > 1 and b < 3 and c:
print("finish")
else:
print("over")
针对上述情况,较少的and时还好,当很多时,我们可以使用all来处理:
if all((a > 1, b < 3, c)):
print("finish")
else:
print("over")
当然除了all之外,我们可以使用any来替换or的情况。
当我们需要将嵌套列表合并为一个列表时
例如
[[], [2, 3, 4, 5]]
-->
[2, 3, 4, 5]
[[1], [3, 4, 5]]
-->
[1, 3, 4, 5]
我们可以使用itertools
的chain
方法, 如下有两种方式
l1 = [[], [2, 3, 4, 5]]
l2 = [[1], [3, 4, 5]]
from itertools import chain
print(list(chain.from_iterable(l1)))
print(list(chain(*l1)))
print(list(chain.from_iterable(l2)))
print(list(chain(*l2)))
不过上述内容只适用于列表嵌套层数是两层的情况,当出现多层时则不适用。
当出现多层嵌套时可以适用如下方法:
def union_list(list_data: list):
for item in list_data:
if isinstance(item, list):
yield from union_list(item)
else:
yield item
由于使用的yield,返回的是生成器,只需将函数的结果用list包裹即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现