Groupby复杂功能

tur*_*tle 0 python

我有一个包含字符串的迭代器:

it = (_ for _ in ['aaxbb', 'aayybb', 'aaaaaaabb', 'ccabcavabb', 'yyaaadbb', 'yyaabb', 'a'])
Run Code Online (Sandbox Code Playgroud)

如果它们具有相同的第一个和最后两个字符,我想将这些字符串分组.上例中groupby的最终结果应该是:

[['aaxbb', 'aayybb', 'aaaaaaabb'],
 ['ccabcavabb'],
 ['yyaaadbb', 'yyaabb'],
 ['a']]
Run Code Online (Sandbox Code Playgroud)

可以使用这个复杂的组来实现itertools.groupby吗?

Mar*_*ers 5

根本不复杂,只返回第一个和最后两个字符的元组:

lambda v: (v[:2], v[-2:])
Run Code Online (Sandbox Code Playgroud)

或者,如果你想使用operator.itemgetter():

from operator import itemgetter

itemgetter(slice(2), slice(-2, None))
Run Code Online (Sandbox Code Playgroud)

演示:

>>> from itertools import groupby
>>> from operator import itemgetter
>>> sample = ['aaxbb', 'aayybb', 'aaaaaaabb', 'ccabcavabb', 'yyaaadbb', 'yyaabb', 'a']
>>> for key, group in groupby(sample, lambda v: (v[:2], v[-2:])):
...     print list(group)
... 
['aaxbb', 'aayybb', 'aaaaaaabb']
['ccabcavabb']
['yyaaadbb', 'yyaabb']
['a']
>>> for key, group in groupby(sample, itemgetter(slice(2), slice(-2, None))):
...     print list(group)
... 
['aaxbb', 'aayybb', 'aaaaaaabb']
['ccabcavabb']
['yyaaadbb', 'yyaabb']
['a']
Run Code Online (Sandbox Code Playgroud)