学习Python中的基本计数

112 阅读3分钟

我和其他人一样喜欢花哨的机器学习算法。但有时,你只需要计算一些东西。而Python的内置数据结构使之非常容易。比方说,我们有一个字符串的列表。

things = [
    "a",
    "a", "b",
    "a", "b", "c",
    "a", "b", "c", "d",
]

对于这样的一个列表,你可能会关心一些不同的计数。所有项目的数量是多少?唯一项目的数量是多少?<some value> 的实例有多少? 所有唯一值的实例有多少?

我们可以用列表、集合和字典轻松有效地回答这些问题。对这些对象非常熟悉,对编写好的 Python 代码非常重要。说到这里,让我们找出我们所有的计数。

计算一个列表中的所有值

我们将从一个简单的开始。

len(things)

# Expected result
# 10

len() 函数适用于内置的 Python 数据结构,但它也适用于任何实现了__len__() 方法的类。例如,在一个 NumPy 数组上调用len() 会返回第一维的大小。

计算一个列表中的唯一值

在一个列表中,有多少个唯一值?回答这个问题,首先创建一个唯一的值集合(也就是一个集合)。然后在这个集合上调用len()

len(set(things))

# Expected result
# 4

这里要指出的一点是,things 并不一定是一个字符串的列表,这样才行。在 Python 中,你可以把任何可散列的对象放入一个集合。默认情况下,这包括简单的数据类型,但是你可以实现__eq__()__hash__() 方法,分别处理对象的平等性和对象的哈希值,以使任何对象都可以哈希。

计算一个特定值的实例

在列表中,有多少个"a" 的实例?你可以通过.count() 方法来了解。

things.count("a")

# Expected result
# 4

很方便!

计算所有唯一值的实例

好的,但是如果我们想计算所有唯一值的实例数量呢?如果你使用Pandas或 SQL,你可能会认识到这是一个group by 操作。事实上,Python带有一个itertools.groupby() 函数,正是这样做的。但是这有点麻烦,因为你必须在传入列表之前对它进行排序。如果你忘记对你的列表进行排序,你不会得到一个错误,你只是得到错误的结果。

相反,让我们回到我们可靠的朋友--集合。如果我们循环浏览所有的唯一值(值的集合),那么我们可以对每个值调用.count() 方法。这将告诉我们我们需要知道的东西。

for value in set(things):
    print(value, things.count(value))

# Expected result
# a 4
# c 2
# b 3
# d 1

这很简单,也很高效。

其他一个很酷的技巧

还有一件事要提到的是,如果你想知道一个列表的所有这些计数,你应该考虑先创建一个值计数的字典。为此你可以使用collections.defaultdict ,但你也可以用字典理解法在一个单行本中创建它。

counts = {value: things.count(value) for value in things}

counts

# Expected result
# {'a': 4, 'b': 3, 'c': 2, 'd': 1}

现在我们有了所有唯一值的计数。但是你也可以得到我们上面讨论的所有其他计数。

# Count all values in the list
sum(counts.values())

# Expected result
# 10

# Count unique values in the list
len(counts.keys())

# Expected result
# 4

# Count instances of a specific value
counts["a"]

# Expected result
# 4