计算列表中的顺序出现和
Counting sequential occurrences in a list and
我有3个列表如下:
L1 = ['H', 'H', 'T', 'T', 'T', 'H', 'H', 'H', 'H', 'T']
L2 = ['H', 'H', 'T', 'T', 'T', 'H', 'H', 'H', 'H', 'T' , 'T', 'H, 'T', 'T', 'T', 'H', 'H', 'H', 'T']
L3 = ['H', 'T', 'H', 'H']
我想计算每个列表中 'H' 的连续出现次数,并生成以下 table 显示这些 'H' 序列的频率:
Length | L1 | L2 | L3
----------------------
1 0 1 1
2 1 1 1
3 0 1 0
4 1 1 0
5 0 0 0
我知道执行以下操作可以得到列表中序列的频率:
from itertools import groupby
[len(list(g[1])) for g in groupby(L1) if g[0]=='H']
[2, 4]
但我需要一种优雅的方式来进一步处理剩余的列表,并确保为未观察到的长度放置“0”。
您可以使用 collections.Counter
从生成器表达式创建一个频率字典,该表达式输出由 itertools.groupby
生成的序列的长度,然后迭代可能长度的 range
从所述字典输出频率,在没有频率的情况下使用 0 作为默认值。
以L1
为例:
from itertools import groupby
from collections import Counter
counts = Counter(sum(1 for _ in g) for k, g in groupby(L1) if k == 'H')
print([counts[length] for length in range(1, 6)])
这输出:
[0, 1, 0, 1, 0]
这可能有效:
from itertools import groupby
a = [len(list(v)) if k=='H' and v else 0 for k,v in groupby(''.join(L1))]
对于列表中没有 'H'
项的样本 L4 = ['T', 'T']
,它 returns [0]
。
对于 L1
它 returns [2, 0, 4, 0]
。
对于 L2
它 returns [2, 0, 4, 0, 1, 0, 3, 0]
。
对于 L3
它 returns [1, 0, 2]
.
请尝试 max([len(x) for x in ''.join(y).split('T')])
,其中 y
是您的列表。
您可以将 itertools.groupby
与 collections.Counter
一起使用:
import itertools as it, collections as _col
def scores(l):
return _col.Counter([len(list(b)) for a, b in it.groupby(l, key=lambda x:x == 'H') if a])
L1 = ['H', 'H', 'T', 'T', 'T', 'H', 'H', 'H', 'H', 'T']
L2 = ['H', 'H', 'T', 'T', 'T', 'H', 'H', 'H', 'H', 'T' , 'T', 'H', 'T', 'T', 'T', 'H', 'H', 'H', 'T']
L3 = ['H', 'T', 'H', 'H']
d = {'L1':scores(L1), 'L2':scores(L2), 'L3':scores(L3)}
r = '\n'.join([f'Length | {" | ".join(d.keys())} ', '-'*20]+[f'{i} {" ".join(str(b.get(i, 0)) for b in d.values())}' for i in range(1, 6)])
print(r)
输出:
Length | L1 | L2 | L3
--------------------
1 0 1 1
2 1 1 1
3 0 1 0
4 1 1 0
5 0 0 0
我有3个列表如下:
L1 = ['H', 'H', 'T', 'T', 'T', 'H', 'H', 'H', 'H', 'T']
L2 = ['H', 'H', 'T', 'T', 'T', 'H', 'H', 'H', 'H', 'T' , 'T', 'H, 'T', 'T', 'T', 'H', 'H', 'H', 'T']
L3 = ['H', 'T', 'H', 'H']
我想计算每个列表中 'H' 的连续出现次数,并生成以下 table 显示这些 'H' 序列的频率:
Length | L1 | L2 | L3
----------------------
1 0 1 1
2 1 1 1
3 0 1 0
4 1 1 0
5 0 0 0
我知道执行以下操作可以得到列表中序列的频率:
from itertools import groupby
[len(list(g[1])) for g in groupby(L1) if g[0]=='H']
[2, 4]
但我需要一种优雅的方式来进一步处理剩余的列表,并确保为未观察到的长度放置“0”。
您可以使用 collections.Counter
从生成器表达式创建一个频率字典,该表达式输出由 itertools.groupby
生成的序列的长度,然后迭代可能长度的 range
从所述字典输出频率,在没有频率的情况下使用 0 作为默认值。
以L1
为例:
from itertools import groupby
from collections import Counter
counts = Counter(sum(1 for _ in g) for k, g in groupby(L1) if k == 'H')
print([counts[length] for length in range(1, 6)])
这输出:
[0, 1, 0, 1, 0]
这可能有效:
from itertools import groupby
a = [len(list(v)) if k=='H' and v else 0 for k,v in groupby(''.join(L1))]
对于列表中没有 'H'
项的样本 L4 = ['T', 'T']
,它 returns [0]
。
对于 L1
它 returns [2, 0, 4, 0]
。
对于 L2
它 returns [2, 0, 4, 0, 1, 0, 3, 0]
。
对于 L3
它 returns [1, 0, 2]
.
请尝试 max([len(x) for x in ''.join(y).split('T')])
,其中 y
是您的列表。
您可以将 itertools.groupby
与 collections.Counter
一起使用:
import itertools as it, collections as _col
def scores(l):
return _col.Counter([len(list(b)) for a, b in it.groupby(l, key=lambda x:x == 'H') if a])
L1 = ['H', 'H', 'T', 'T', 'T', 'H', 'H', 'H', 'H', 'T']
L2 = ['H', 'H', 'T', 'T', 'T', 'H', 'H', 'H', 'H', 'T' , 'T', 'H', 'T', 'T', 'T', 'H', 'H', 'H', 'T']
L3 = ['H', 'T', 'H', 'H']
d = {'L1':scores(L1), 'L2':scores(L2), 'L3':scores(L3)}
r = '\n'.join([f'Length | {" | ".join(d.keys())} ', '-'*20]+[f'{i} {" ".join(str(b.get(i, 0)) for b in d.values())}' for i in range(1, 6)])
print(r)
输出:
Length | L1 | L2 | L3
--------------------
1 0 1 1
2 1 1 1
3 0 1 0
4 1 1 0
5 0 0 0