首页 > 解决方案 > 如何计算从列表中打印特定值的次数?

问题描述

我做了一个简单的投币器程序,命名为翻转硬币并打印出价值。

我的目标是打印大量掷硬币并记录正面朝上的次数和反面朝上的次数。但显然我不能,因为我不知道如何计算它落在特定值上的次数。

import random

heads_or_tail = ['heads', 'tail']


def flip_coin():
    flip_coin = random.choice(heads_or_tail)
    print(flip_coin)


for x in range(100):
    flip_coin()

标签: python

解决方案


collections模块有一个很棒的功能,称为Counter

import collections
import random

heads_or_tail = ['heads', 'tail']


def flip_coin():
    flip_coin = random.choice(heads_or_tail)
    return flip_coin

cnt = collections.Counter()
for x in range(100):
    cnt[flip_coin()] += 1

输出:

>>> cnt
Counter({'tail': 50, 'heads': 50})

或者,您可以只使用普通的dict,但这需要更多的样板代码:

# Alternatively, you could just use a `dict`
dict_cnt = {}
for x in range(100):
    fc = flip_coin()
    if fc in dict_cnt:
        dict_cnt[fc] += 1
    else:
        dict_cnt[fc] = 1

请记住,最 Python 的做法是使用其他人已经完善的库——尤其是来自 Python 标准库的库。因此,在计算时,我建议您使用collections.Counter.

此外,Counter还有更多很酷的功能,您可以在docs中查看。

正如其他人所提到的,您可以使用传递给Counter构造函数的生成器,因为它是可迭代的 - 这将显着缩短您的代码:

import collections
import random

flip_gen = (random.choice(['heads', 'tails']) for _ in range(100))
cnt = collections.Counter(flip_gen)

>>> cnt
Counter({'heads': 51, 'tail': 49})

推荐阅读