在列表中获取相同值的序列并计算序列中的元素

时间:2018-11-13 12:59:49

标签: python

我想从列表中找到序列中具有相同值的数量:

list = ['A','A','A','B','B','C','A','A']

结果应如下所示:

result_dic = {A: [3,2], B: [2], C: [1]}

我不只是想要列表中不同值的计数,正如您在A的结果中看到的那样。

3 个答案:

答案 0 :(得分:3)

collections.defaultdictitertools.groupby

from itertools import groupby
from collections import defaultdict

listy = ['A','A','A','B','B','C','A','A']

d = defaultdict(list)

for k, v in groupby(listy):
  d[k].append(len([*v]))

d

defaultdict(list, {'A': [3, 2], 'B': [2], 'C': [1]})

  • groupby将遍历可迭代和块状的连续对象。

    [(k, [*v]) for k, v in groupby(listy)]
    
    [('A', ['A', 'A', 'A']), ('B', ['B', 'B']), ('C', ['C']), ('A', ['A', 'A'])]
    
  • 因此,我遍历这些结果并将每个分组对象的长度附加到defaultdict

  • 的值上

答案 1 :(得分:2)

我建议使用defaultdict并遍历列表。

from collections import defaultdict

sample = ['A','A','A','B','B','C','A','A']

result_dic = defaultdict(list)
last_letter = None
num = 0

for l in sample:
    if last_letter == l or last_letter is None:
        num += 1
    else:
        result_dic[last_letter].append(num)

修改 这是我的方法,尽管我会看一下@piRSquared的答案,因为它们非常热衷于也包括groupby。干得好!

答案 2 :(得分:0)

我建议循环浏览列表。

result_dic = {}
old_word = ''

for word in list:
    if not word in result_dic:
        d[word] = [1]
    elif word == old_word:
        result_dic[word][-1] += 1
    else:
        result_dic[word].append(1)
    old_word = word