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

问题描述 投票:0回答:1

我知道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)

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

python list sum boolean
1个回答
5
投票

如果我使用元组或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是一个数组,所以你想直接得到它的总和。将其包装在另一个列表中意味着您将获取数组列表的总和而不是布尔值列表。

© www.soinside.com 2019 - 2024. All rights reserved.