Python divide una lista en subconjuntos basados ​​en patrones

Estoy haciendo esto pero siento que esto se puede lograr con mucho menos código. Es Python después de todo. Comenzando con una lista, divido esa lista en subconjuntos basados ​​en un prefijo de cadena.

# Splitting a list into subsets # expected outcome: # [['sub_0_a', 'sub_0_b'], ['sub_1_a', 'sub_1_b']] mylist = ['sub_0_a', 'sub_0_b', 'sub_1_a', 'sub_1_b'] def func(l, newlist=[], index=0): newlist.append([i for i in l if i.startswith('sub_%s' % index)]) # create a new list without the items in newlist l = [i for i in l if i not in newlist[index]] if len(l): index += 1 func(l, newlist, index) func(mylist) 

Usted podría usar itertools.groupby :

 >>> import itertools >>> mylist = ['sub_0_a', 'sub_0_b', 'sub_1_a', 'sub_1_b'] >>> for k,v in itertools.groupby(mylist,key=lambda x:x[:5]): ... print k, list(v) ... sub_0 ['sub_0_a', 'sub_0_b'] sub_1 ['sub_1_a', 'sub_1_b'] 

o exactamente como lo especificaste:

 >>> [list(v) for k,v in itertools.groupby(mylist,key=lambda x:x[:5])] [['sub_0_a', 'sub_0_b'], ['sub_1_a', 'sub_1_b']] 

Por supuesto, se aplican las advertencias comunes (asegúrese de que su lista esté ordenada con la misma clave que está usando para agrupar), y es posible que necesite una función de teclas un poco más complicada para los datos del mundo real …

 In [28]: mylist = ['sub_0_a', 'sub_0_b', 'sub_1_a', 'sub_1_b'] In [29]: lis=[] In [30]: for x in mylist: i=x.split("_")[1] try: lis[int(i)].append(x) except: lis.append([]) lis[-1].append(x) ....: In [31]: lis Out[31]: [['sub_0_a', 'sub_0_b'], ['sub_1_a', 'sub_1_b']] 

Use el itertools de groupby

 def get_field_sub(x): return x.split('_')[1] mylist = sorted(mylist, key=get_field_sub) [ (x, list(y)) for x, y in groupby(mylist, get_field_sub)]