如何通过分组在Python3.7中多次出现的值来缩短列表?

2024-04-19 16:26:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类似这样的清单:

foo = ['bar', 'bar', 'bar', 'foo', 'foo','bar']

我想把它转换成这样:

'1-3 = bar'
'4-5 = foo'
'6 = bar'

转换需要自动完成,以适应列表更改。我该如何实现自动化呢?你知道吗


Tags: 列表foobar
3条回答

一种可能的解决方案(没有来自itertoolsgroupby):

foo = ['bar', 'bar', 'bar', 'foo', 'foo','bar']

def my_groupby(l):
    first, last, current_value = 0, 0, l[0]
    for i, value in enumerate(l):
        if value != current_value:
            yield first + 1, last + 1, current_value
            current_value, first, last = value, i, i
        else:
            last = i
    yield first + 1, last + 1, current_value

for first, last, value in my_groupby(foo):
    if first != last:
        print(f'{first}-{last} = {value}')
    else:
        print(f'{first} = {value}')

印刷品:

1-3 = bar
4-5 = foo
6 = bar
from itertools import groupby
foo = ['bar', 'bar', 'bar', 'foo', 'foo','bar']
pos = 1
for k, g in groupby(foo):
    count = len(list(g))
    if count == 1:
        print('%d = %s' % (pos, k))
    else:
        print('%d - %d = %s' % (pos, pos + count - 1, k))
    pos += count

这将输出:

1 - 3 = bar
4 - 5 = foo
6 = bar

不清楚你到底想要什么,但你可以数元素

>>> foo = ['bar', 'bar', 'bar', 'foo', 'foo','bar']
>>> from collections import Counter
>>> Counter(foo)
Counter({'bar': 4, 'foo': 2})

或者

>>> ['bar', 'bar', 'bar', 'foo', 'foo','bar'].count('bar')
4

相关问题 更多 >