获取子列表在列表中出现的次数
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
它说我只能有一个参数使用计数方法。目前我正在构建一个游戏,用户输入 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