获取子列表在列表中出现的次数

Get number of times a sublist occurs in a list

它说我只能有一个参数使用计数方法。目前我正在构建一个游戏,用户输入 H 或 T,2 名电脑玩家随机选择 H 或 T 4 轮。我必须记录我已经完成的答案,并将其放入一个元组中。

示例: 玩家 1 投掷 ['T'、'H'、'H'、'T'] 玩家 2 投掷 ['T'、'T'、'H'、'T']

那我就得说序列(H,H)在每个元组中出现了多少次。在上面的例子中,玩家 1 在元组中有一个序列 ('H', 'H')。我试过使用以下代码,但它不起作用。

sequence1 = player1_toss.count('H', 'H')
sequence2 = player2_toss.count('H', 'H')
print('H H found in the player 1 sequence', sequence1, 'times')

我一直收到错误 'builtins.TypeError: list.count() takes exactly one argument (2 given)'。 无论如何我可以解决这个问题吗?任何帮助将不胜感激。

list.count(x) returns 次数 x 在列表中出现的次数,你想要的是 子列表 模式的次数出现在列表中。

你可以使用这个功能-

def count_occurences(source, target):
    # returns no. of times target sublist occurs in source list
    count = 0
    for i in range(len(source) - len(target) + 1):
        if source[i:i+len(target)] == target:
            count += 1
    return count
>>> count_occurences(['T', 'H', 'H', 'T'], ['H', 'H'])
1
>>> count_occurences(['T', 'H', 'T', 'T'], ['H', 'H'])
0
>>> count_occurences(['H', 'H', 'H', 'T'], ['H', 'H'])
2
>>> count_occurences(['H', 'H', 'H', 'T'], ['H', 'H', 'H'])
1

如果子列表很大,请查看一些 string-matching algorithms/正则表达式,这将是解决此问题的最佳方法。

我编写了一个名为 find 的例程,它将在序列中找到子序列出现的位置。既然你想要计数,那么你只需要找到子序列被找到的次数。当您通过 all=True 时,所有细节都在以下代码中计算出来。对原始算法的引用在评论中。这个和相关的例程是 here

def find(seq, subseq, start=0, all=False):
    """Return starting index at which subsequence appears in sequence
    at or beyond the index corresponding to position `start`, else -1.

    Examples
    ========

    >>> from sympy.utilities.iterables import find
    >>> find('alabaster', 'ba')
    3
    >>> find('alabaster', 'a', start=1)
    2
    >>> find('alabaster', 'e', start=-3)
    7

    To find all occurances at or past the start,
    set keyword `all` to True:

    >>> find('alabaster', 'a', all=True)
    [0, 2, 4]
    >>> find('alabaster', 'a', 1, all=True)
    [2, 4]

    See Also
    ========
    group, multiset, runs, split

    """
    # adapted from http://code.activestate.com/recipes/
    # 117223-boyer-moore-horspool-string-searching/
    from collections import defaultdict
    m = len(subseq)
    n = len(seq)
    if m > n:
        return -1 if not all else []
    if start < 0:
        start = max(-n, start) + n
    skip = defaultdict(lambda: m)
    for k in range(m - 1):
        skip[subseq[k]] = m - k - 1
    k = m - 1 + start
    loc = []
    while k < n:
        j = m - 1
        i = k
        while j >= 0 and seq[i] == subseq[j]:
            j -= 1
            i -= 1
        if j == -1:
            if all:
                loc.append(i + 1)
            else:
                return i + 1
        k += skip[seq[k]]
    return -1 if not all else loc

例如len(find('h h h t'.split(),'h h'.split(), all=True)) -> 2