简体   繁体   English

遍历python中的嵌套列表

[英]iterating through nested lists in python

I'm trying to iterate through a list and depending on several conditions to rearrange the items in the list in sublists, all inside the original list that is. 我试图遍历一个列表,并根据几种条件重新排列子列表中列表中的项目,所有这些都在原始列表中。 so with the code below in Python, while the list1 prints correctly by grouping 0s, 1s and 2s : 因此,使用Python中的以下代码,虽然list1通过将0s,1s和2s分组可以正确打印:

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

everything gets mixed up on the 2nd list trying to re-group in further sublists As Bs Cs by getting : 一切都混在第二个列表中,尝试通过以下方式将其他子列表重新分组为Bs Cs:

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

while expecting to get: 期望得到:

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

below is the code I used (sorry for the length, i'm sure there is a very reduced version). 下面是我使用的代码(对不起,我确定有一个简化的版本)。

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();

Sort on your grouping criteria, then use itertools.groupby() : 根据您的分组条件排序,然后使用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)]

Demonstration: 示范:

>>> 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']]]

Your output requirement is a little convoluted; 您的输出要求有些复杂; if returning lists of the grouped elements is enough, calling list() on grouped is enough: 如果返回分组元素的list()就足够了,那么对grouped调用list()就足够了:

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

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

Consider more_itertools.chunked , which accepts an iterable and a chunk size n : 考虑more_itertools.chunked ,它接受一个可迭代的块大小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']]]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM