【问题标题】:Sum of Boolean List in Python not functioning as expectedPython中布尔列表的总和未按预期运行
【发布时间】:2018-06-09 11:01:26
【问题描述】:

我知道 python 可以将“真”视为“1”(许多编码语言也是如此),因此采用列表的 sum() 应该返回列表中的真数。 (如Counting the number of True Booleans in a Python List 所示)

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

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

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

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

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

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

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

“测试”似乎也是一个正确的布尔列表,因为以下代码使用它来子集“波士顿”也可以正常工作:

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

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

【问题讨论】:

  • 或许你可以发一个minimal reproducible example
  • 因为它计算0 + 第一行 + 第二行 + ...。如果你想要总和,使用 `(Boston['rm'] > 7).sum()

标签: python list sum boolean


【解决方案1】:

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

【讨论】:

  • 我明白了,这就是 sum 返回 0 和 1 列表的原因;每个值(真或假)都被视为(并求和)单独的项目(分别为 0 或 1)?
  • @KMorgan:是的,sum(l) 计算 0 + l[0] (+ l[1] + …),而 numpy 的魔法使 0 + l[0] 相当于将 0 添加到数组的每个项目中。
猜你喜欢
  • 1970-01-01
  • 2016-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-27
  • 2019-01-06
  • 1970-01-01
相关资源
最近更新 更多