如何使用Python的itertools.groupby()方法将一个字符串列表按照它们的第一个字符分组?

14

我有一个类似于这个列表的字符串列表:

tags = ('apples', 'apricots', 'oranges', 'pears', 'peaches')

我该如何使用itertools.groupby(),按每个字符串的第一个字符对此列表进行分组?我应该如何提供itertools.groupby()所需的'key'参数?

4个回答

27
你可能想要在此之后创建一个dict
from itertools import groupby

d = {k: list(v) for k, v in groupby(sorted(tags), key=lambda x: x[0])}

1
但不要忘记先对其进行排序! - Matthew
@Matthew,为什么我们需要排序? - leleogere
1
@leleogere itertools.groupby() 要求可迭代对象已排序,请参见 https://docs.python.org/3/library/itertools.html#itertools.groupby - Matthew
谢谢,我现在明白了。但是,我不理解这个表述:“通常情况下,可迭代对象需要在相同的键函数上进行排序”。为什么只是通常情况呢?难道不总是需要吗? - leleogere

16
groupby(sorted(tags), key=operator.itemgetter(0))

1
它可以处理Unicode。如果你在问它能否处理UTF-8字符串,那么你应该问的是什么时候你应该将其解码为Unicode。当然,答案是尽快解码。 - Ignacio Vazquez-Abrams
谢谢,它的工作效果如预期。我有一个包含多种语言标签的列表,并将通过各种翻译器进行排序测试。 - Adam Ziolkowski
1
实际上应该是:groupby(sorted(tags), key=operator.itemgetter(0)) - sandyp

5
>>> for i, j in itertools.groupby(tags, key=lambda x: x[0]):
    print(i, list(j))


a ['apples', 'apricots']
o ['oranges']
p ['pears', 'peaches']

2

只是另一种方式,

>>> from collections import defaultdict
>>> t=defaultdict(list)
>>> for items in tags:
...     t[items[0]].append(items)
...
>>> t
defaultdict(<type 'list'>, {'a': ['apples', 'apricots'], 'p': ['pears', 'peaches'], 'o': ['oranges']})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接