我正在寻找一种方法来计算向量中的组数。在这种情况下,组的定义是连续顺序中相同值的最大序列。例如:
['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循环,但我认为这是一种更简单的方法。
答案 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