如何计算向量中的组数?

时间:2017-02-03 23:53:02

标签: python for-loop

我正在寻找一种方法来计算向量中的组数。在这种情况下,组的定义是连续顺序中相同值的最大序列。例如:

  • ['T', 'H', 'T', 'T', 'H', 'H', 'T', 'H', 'T', 'T']

    有7个小组。

  • ['H', 'T', 'H', 'H', 'H', 'H', 'H', 'T', 'T', 'H']

    有5组

  • ['H', 'H', 'T', 'H', 'T', 'H', 'H', 'H', 'T', 'H']

    有7组

有什么想法吗?我想在每次迭代时检查一个for循环,但我认为这是一种更简单的方法。

3 个答案:

答案 0 :(得分:4)

在Python中,提到的数据结构称为list。您可以使用itertools.groupby查找组:

>>> from itertools import groupby
>>> my_list = ['T', 'H', 'T', 'T', 'H', 'H', 'T', 'H', 'T', 'T']

>>> len(list(groupby(my_list)))
7

答案 1 :(得分:2)

您可以使用itertools groupby来实现目标

from itertools import groupby
a = ['H', 'H', 'T', 'H', 'T', 'H', 'H', 'H', 'T', 'H']
print (len(list(groupby(a))))

答案 2 :(得分:2)

您想知道元素的更改次数,您还可以使用常规for循环来检查:

File::Glob

或@MoinuddinQuadri评论的另一个选项,使用lst = ['T', 'H', 'T', 'T', 'H', 'H', 'T', 'H', 'T', 'T'] sum(1 for i in range(len(lst)-1) if lst[i] != lst[i+1]) + 1 # 7

zip

python 2.7上的一些基准测试:

sum(1 for x, y in zip(lst[:-1], lst[1:]) if x != y) + 1
# 7

并且,Python 3.4的基准测试:

import random
from itertools import groupby
lst = [random.choice(["T", "H"]) for _ in range(1000000)]

%timeit sum(1 for i in range(len(lst)-1) if lst[i] != lst[i+1]) + 1
10 loops, best of 3: 111 ms per loop

%timeit sum(1 for x, y in zip(lst, lst[1:]) if x != y) + 1
10 loops, best of 3: 132 ms per loop

%timeit len(list(groupby(lst)))
10 loops, best of 3: 73.8 ms per loop