在列表的开头查找相等元素的数量

nfm*_*ure 3 python indexing list

给定python中的列表,我想找到列表开头有多少相等的元素.

输入示例:

x1 = ['a','a','b','c','a','a','a','c']
x2 = [1, 1, 1, 3, 1, 1, 1, 8]
x3 = ['foo','bar','foobar']
Run Code Online (Sandbox Code Playgroud)

将输出一些神奇的功能(或一个衬垫):

f(x1) = 2 # There are 2 'a' values in the beginning.
f(x2) = 3 # There are 3 1-values in the beginning.
f(x3) = 1 # Only 1 'foo' in beginning.
Run Code Online (Sandbox Code Playgroud)

如果我做:

sum([1 if x=='a' else 0 for x in x1])
Run Code Online (Sandbox Code Playgroud)

我只是得到x1中'a'的出现次数,而不是一行中前导值的数量.如果有一个不需要知道第一个值的单线程,那将会很高兴.

mgi*_*son 5

itertools.groupby 可以帮助 ...

from itertools import groupby

def f(lst):
    if_empty = ('ignored_key', ())
    k, v = next(groupby(lst), if_empty)
    return sum(1 for _ in v)
Run Code Online (Sandbox Code Playgroud)

当然,我们可以把它变成1-liner(没有导入):

sum(1 for _ in next(groupby(lst), ('ignored', ()))[1])
Run Code Online (Sandbox Code Playgroud)

但我不会真的推荐它.


演示:

>>> from itertools import groupby
>>> 
>>> def f(lst):
...     if_empty = ('ignored_key', ())
...     k, v = next(groupby(lst), if_empty)
...     return sum(1 for _ in v)
... 
>>> f(x1)
2
>>> f(x2)
3
>>> f(x3)
1
>>> f([])
0
Run Code Online (Sandbox Code Playgroud)