Python中布尔列表的总和不能按预期运行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python中布尔列表的总和不能按预期运行相关的知识,希望对你有一定的参考价值。

我知道python可以将'True'视为'1'(与许多编码语言一样),因此获取列表的sum()应返回列表中的trues数。 (如Counting the number of True Booleans in a Python List所示)

我是Python的新手,并且已经在Python(http://www.springer.com/us/book/9781461471370)中进行了一些ISLR应用程序练习。

第2章,问题10(h)有一个非常简单的问题,要求变量('rm')的观察数大于7.我希望以下代码能够工作:

test = [Boston['rm'] > 7]
sum(test)

然而,这会返回整个列表“test”,其中包含0和1,而不是其总和。有谁能解释为什么? (注意波士顿来自R中MASS包的波士顿数据集)

如果我使用元组或numpy数组而不是列表它可以正常工作;例如:

test2 = (Boston['rm'] > 7)
sum(test2)

test3 = np.array(Boston['rm'] > 7)
sum(test3)

此外,“test”似乎是一个合适的布尔列表,因为以下代码使用它来子集“Boston”也可以正常工作:

test4 = Boston[Boston['rm'] > 7]
len(test4)

虽然我已经清楚地发现了几种有效的方法,但我很困惑为什么第一种方法没有。提前致谢。

答案

如果我使用元组或numpy数组而不是列表它可以正常工作;例如:

test2 = (Boston['rm'] > 7)
sum(test2)

test3 = np.array(Boston['rm'] > 7)
sum(test3)

(Boston['rm'] > 7)使用括号进行分组;它不是一个元组。元组等价物将是(Boston['rm'] > 7,)(注意逗号),它以与列表相同的方式中断。在数组上使用np.array不会改变它 - 它就像list(5)[5]之间的区别。

至于为什么它不起作用:Boston['rm'] > 7是一个数组,所以你想直接得到它的总和。将其包装在另一个列表中意味着您将获取数组列表的总和而不是布尔值列表。

以上是关于Python中布尔列表的总和不能按预期运行的主要内容,如果未能解决你的问题,请参考以下文章

为啥字符串相等在此 Python 代码中不能按预期工作? [复制]

Ext.plugin.SortableList 不能按预期工作

限制Python3 urllib请求所花费的时间:超时不能按我的预期运行

使用动态编程从 Python 上的子集总和问题中获取所有子集

我的 django 模板布尔变量在 javascript 中没有按预期工作

为什么!字符串列表中的字符串不能按dplyr中的预期工作