2012-11-22 2 views
2

J'essaie de parcourir une liste et en fonction de plusieurs conditions pour réorganiser les éléments de la liste dans les sous-listes, le tout dans la liste originale qui est. donc avec le code ci-dessous en Python, tandis que les impressions list1 correctement en regroupant 0s, 1 et 2 s:itération à travers des listes imbriquées en python

new list 1 = [['A0', 'B0', 'C0'], ['A1', 'B1', 'C1'], ['A2', 'B2', 'C2']] 

tout se mélange sur la liste 2 en essayant de regrouper dans d'autres sous-listes Comme hôtes Cs en obtenant:

new list 2 = [[['A0', 'A1', 'A2'], ['B0', 'B1', 'B2'], ['C0', 'C1', 'C2']]] 

tout en attendant d'obtenir:

new list 1 = [[['A0'], ['B0'], ['C0']], [['A1'], ['B1'], ['C1']], [['A2'], ['B2'], ['C2']]] 

ci-dessous est le code je (désolé pour la longueur, je suis sûr qu'il ya une version très réduite).

def Main(): 

    array = ['A0', 'A1', 'A2', 'B0', 'B1', 'B2', 'C1', 'C0', 'C2'] 

    list1 = NewList1(array) 
    print 'new list 1 = ' + str(list1) 

    list2 = NewList2(list1) 
    print 'new list 2 = ' + str(list2) 

def NewList1(thelist): 
    sublist1=[] 
    sublist2=[] 
    sublist3=[] 
    sublist4=[] 
    newlist=[] 
    for item in thelist: 
     if hasattr(item,"__iter__"): 
      for subitem in item: 
       sublist1.append(subitem) 
     elif "0" in item: 
       sublist2.append(item) 
     elif "1" in item: 
       sublist3.append(item) 
     elif "2" in item: 
       sublist4.append(item) 
     else: 
      newlist.append(item) 
    if sublist2: newlist.append(sublist2) 
    if sublist3: newlist.append(sublist3) 
    if sublist4: newlist.append(sublist4) 

    if sublist1: newlist.append(NewList1(sublist1)) 

    return newlist 


def NewList2(thelist): 
    sublist1=[] 
    sublist2=[] 
    sublist3=[] 
    sublist4=[] 
    newlist=[] 
    for item in thelist: 
     if hasattr(item,"__iter__"): 
      for subitem in item: 
       sublist1.append(subitem) 
     elif "A" in item: 
       sublist2.append(item) 
     elif "B" in item: 
       sublist3.append(item) 
     elif "C" in item: 
       sublist4.append(item) 
     else: 
      newlist.append(item) 
    if sublist2: newlist.append(sublist2) 
    if sublist3: newlist.append(sublist3) 
    if sublist4: newlist.append(sublist4) 

    if sublist1: newlist.append(NewList2(sublist1)) 

    return newlist 

Main(); 
+0

En tant que conseil général : Il y a presque toujours une meilleure solution que le codage en dur le nombre d'éléments (dans votre cas, le nombre de sous-listes). Si vous généraliser pour un nombre inconnu de sous-listes, votre code est plus flexible et réutilisable. –

Répondre

3

Trier sur vos critères de regroupement, puis utilisez itertools.groupby():

from itertools import groupby 

key = lambda el: el[1] 
list2 = [[[el] for el in grouped] for group, grouped in groupby(sorted(input, key=key), key)] 

Démonstration:

>>> from itertools import groupby 
>>> input = ['A0', 'A1', 'A2', 'B0', 'B1', 'B2', 'C1', 'C0', 'C2'] 
>>> key = lambda el: el[1] 
>>> [[[el] for el in grouped] for group, grouped in groupby(sorted(input, key=key), key)] 
[[['A0'], ['B0'], ['C0']], [['A1'], ['B1'], ['C1']], [['A2'], ['B2'], ['C2']]] 

Votre exigence de sortie est un peu alambiquée; si le retour des listes des éléments groupés suffit, appeler list() sur grouped suffit:

>>> [list(grouped) for group, grouped in groupby(sorted(input, key=key), key)] 
[['A0', 'B0', 'C0'], ['A1', 'B1', 'C1'], ['A2', 'B2', 'C2']] 
1
 python 3.2 

    [[[i] for i in v] for v in list1] 
0

Tenir compte more_itertools.chunked, qui accepte une itérables et une taille de morceau n:

import more_itertools as mit 

data = ['A0', 'A1', 'A2', 'B0', 'B1', 'B2', 'C1', 'C0', 'C2'] 

list(mit.chunked(data, 3)) 
# [['A0', 'A1', 'A2'], ['B0', 'B1', 'B2'], ['C1', 'C0', 'C2']] 

list(mit.chunked(list(mit.chunked(data, 1)), 3)) 
# [[['A0'], ['A1'], ['A2']], [['B0'], ['B1'], ['B2']], [['C1'], ['C0'], ['C2']]] 
Questions connexes