【问题标题】:Counting sequential occurrences in a list and计算列表中的连续出现和
【发布时间】:2019-09-05 16:24:05
【问题描述】:

我有 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”。

【问题讨论】:

    标签: python list count sequence


    【解决方案1】:

    您可以使用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]
    

    【讨论】:

      【解决方案2】:

      您可以将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
      

      【讨论】:

        【解决方案3】:

        这可能有效:

        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]

        【讨论】:

          【解决方案4】:

          请尝试max([len(x) for x in ''.join(y).split('T')]),其中y 是您的列表。

          【讨论】:

            猜你喜欢
            • 2019-09-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-24
            • 2019-05-05
            相关资源
            最近更新 更多