簡體   English   中英

計算列表中的連續出現次數

[英]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'並生成下表,顯示這些'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]

您可以將itertools.groupbycollections.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

這可能有效:

from itertools import groupby
a = [len(list(v)) if k=='H' and v else 0 for k,v in groupby(''.join(L1))]

對於樣本L4 = ['T', 'T'] ,其中列表中沒有'H'項,它返回[0] 對於L1它返回[2, 0, 4, 0] 對於L2它返回[2, 0, 4, 0, 1, 0, 3, 0] 對於L3它返回[1, 0, 2] L3 [1, 0, 2]

請嘗試max([len(x) for x in ''.join(y).split('T')])其中y是你的列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM