为这个模糊的标题提前道歉.我不知道该如何表达我遇到的情况.

想象一下,在变量title_author中,一本书的标题和作者在一起,用-隔开.你从网上刮取了这些信息,所以很可能这个项目是None.显然你想把标题和作者分开,所以你会使用split.但如果title_author一开始没有,你只希望titleauthor都是None.

我认为以下是一个很好的方法:

title_author = "In Search of Lost Time - Marcel Proust"
title, author = title_author.split("-", 1) if title_author else None, None
print(title, author)
# ['In Search of Lost Time ', ' Marcel Proust'] None

但令我惊讶的是,现在title是分裂的结果,authorNone.解决方案是通过括号显式指示else子句是元组.

title, author = title_author.split("-", 1) if title_author else (None, None)
print(title, author) 
# In Search of Lost Time   Marcel Proust

为什么会这样?导致第一个案件结果的执行顺序是什么?

推荐答案

title, author = title_author.split("-", 1) if title_author else None, None

与以下内容相同:

title, author = (title_author.split("-", 1) if title_author else None), None

因此,author总是None


Explaination:

official doc开始

赋值语句计算表达式列表(请记住

也就是说,中断器将查找(x,y)=(a,b),并将值分配为x=ay=b.

在您的 case 中,有两种解释,主要区别在于:

  1. title, author = (title_author.split("-", 1) if title_author else None), None

  2. title, author = title_author.split("-", 1) if title_author else (None, None)实际上是将一个值(列表或元组)分配给两个变量,这需要解包步骤将两个变量映射到列表/元组中的两个值.

由于选项1可以在不拆包的情况下完成,即更少的操作,因此断路器将在没有明确指示的情况下使用选项1.

Python相关问答推荐

找到相对于列表索引的当前最大值列表""

使用类型提示进行类型转换

在Django中重命名我的表后,旧表中的项目不会被移动或删除

我可以不带视频系统的pygame,只用于游戏手柄输入吗?''

如何写一个polars birame到DuckDB

遍历列表列表,然后创建数据帧

Scipy.linprog的可行性有问题吗?(A_ub@x0<;=b_ub).all()为True-但是-linprog(np.zeros_like(X0),A_ub=A_ub,b_ub=b_ub)不可行

奇怪的Base64 Python解码

使用Django标签显示信息

使用pytest测试是否缺少导入

如何仅使用数据帧操作获得特定的唯一数据帧组合?

SQL模型中包含日期时间的TypeError

如何使用aiohttp获取图像并直接处理它而不保存它?

在Python Polar中从一个函数调用添加多个列

不同 chromium 版本的selenium未检测到的 chromium 驱动器?

在Pandas 中通过GroupBy操作创建新列时出现KeyError

嘲弄直接导入的函数?

Django按字段上的子字符串分组

极轴:通过创建多个新列对列进行操作

聚合数据帧的n个连续行的惯用方式