Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算列表中连续出现的次数,并_Python_List_Count_Sequence - Fatal编程技术网

Python 计算列表中连续出现的次数,并

Python 计算列表中连续出现的次数,并,python,list,count,sequence,Python,List,Count,Sequence,我有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”,并生成下表,显示这些“H”序列的频率: Length | L1 | L2 |

我有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”,并生成下表,显示这些“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']

但是我需要一种优雅的方法来进一步处理剩余的列表,并确保为未观察到的长度放置一个“0”。

您可以使用
集合.Counter
从生成器表达式创建一个频率dict,该表达式输出由
itertools.groupby
生成的序列长度,然后迭代可能长度的
范围
,以从所述dict输出频率,在没有频率的情况下,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']
,它返回
[0]
。 对于
L1
它返回
[2,0,4,0]
。 对于
L2
它返回
[2,0,4,0,1,0,3,0]

对于
L3
它返回
[1,0,2]
请尝试
max([len(x)代表x in.''。加入(y).拆分('T'))
其中
y
是您的列表。

您可以将
itertools.groupby
集合一起使用。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])

输出:

Length | L1 | L2 | L3 
--------------------
1          0   1   1
2          1   1   1
3          0   1   0
4          1   1   0
5          0   0   0
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