python - 了解列表与系列中的 Python 语法
问题描述
我是数据科学领域的 Python 新手(没有计算机科学背景)。我一直听说 Python 很简单,但我正在逐步取得进步。例如,我理解:
len(titles[(titles.year >= 1950) & (titles.year <=1959)])
“在标题数据框中,创建一个系列并从标题数据框的年份列中获取大于或等于 1950 和小于或等于 1959 的任何内容。取它的长度。”
但是当我遇到以下情况时,我不明白其中的逻辑:
t = titles
(t.year // 10 * 10).value_counts().sort_index().plot(kind='bar')
或者
titles.title.value_counts().head(10)
在这两种情况下,我显然可以拼凑起来。但目前尚不清楚。其次,为什么 Python 不允许我像第一个示例中那样使用方括号和正则括号?
解决方案
这不是关于lists
vs pd.Series
,而是关于Python中括号 ( ()
) 与括号 ( ) 的功能。[]
括号主要用于两种情况:修改操作的优先顺序,以及在调用函数时分隔参数。
1 + 2 * 3
and之间的区别(1 + 2) * 3
是显而易见的,如果你想将a
and传递b
给一个函数f
,f a b
它将不起作用,这与 Haskell 不同。
我们主要关心这里的第一次使用;例如,在这一行中:
(t.year // 10 * 10).value_counts().sort_index().plot(kind='bar')
如果没有括号,您将调用该方法链 on 10
,这是没有意义的。显然,您想根据括号表达式的结果调用它们。
现在,在数学中,括号也可以与括号一起用于表示优先级,以防多个嵌套括号会造成混淆。例如,两者在数学上可能是等价的:
[(1 + 2) * 3] ** 4
((1 + 2) * 3) ** 4
但是,在 Python 中情况并非如此:((1 + 2) * 3) ** 4
可以求值,而[(1 + 2) * 3] ** 4
is a TypeError
,因为括号内的部分解析为 a list
,并且您不能对 执行求幂lists
。
相反,在类似的事情中发生的事情与titles[titles.year >= 1950]
优先级没有直接关系(当然,括号外的任何内容都不会成为内部表达式的一部分)。
相反,括号表示索引;在某种程度上, 的值titles.year >= 1950
用于从中获取元素titles
(这是使用__getitem__
dunder 方法的重载来完成的)。
此索引的确切性质可能不同;lists
取整数,dicts
取任何可散列的对象pd.Series
,除其他外,取布尔值pd.Series
(这就是这里发生的事情),但它们最终代表了对索引对象进行子集化的某种方式。
因此,在语义上,我们可以看到括号的含义与括号不同,并且不可互换。
为了完整起见,使用方括号而不是圆括号有一个切实的好处:它允许重新分配,因为它会根据是否正在执行分配自动委托给__setitem__
or 。__getitem__
因此,如果你愿意,你可以做类似的事情titles[titles.year >= 1950] = 'Nothing'
。但是,在所有情况下,titles(titles.year >= 1950) = 'Nothing'
委托给__call__
, and 因此都会以下列方式失败:
SyntaxError: can't assign to function call
推荐阅读
- tortoisesvn - Tortoise SVN 提交查询
- javascript - iCheck 在车把模板中不起作用
- c++ - 事务中的 sqlite3_step(stmt) 失败,错误 5 没有调用我的忙处理程序
- ssl - 如何在 NestJs 中通过 https 创建套接字?
- java - 如何从 python3.6.10 加载最新的 pmml 模型?
- android - 如何在 Flutter 的设备存储中获取所有 .pdf 和 .epub 文件?
- flutter - Flutter Bloc 等式状态未使用 Map of Strings 属性进行更新
- angular - Msal Angular 未在会话存储中使用现有令牌
- azure-active-directory - APIM 最佳实践中的 AAD 令牌缓存
- c# - String.IsNullOrEmpty 单子