【问题标题】:iterating through nested lists in python遍历python中的嵌套列表
【发布时间】:2012-11-11 02:57:18
【问题描述】:

我正在尝试遍历一个列表,并根据几个条件在子列表中重新排列列表中的项目,所有这些都在原始列表中。因此使用 Python 中的以下代码,而 list1 通过分组 0s、1s 和 2s 正确打印:

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

第二个列表中的所有内容都混淆了,试图通过获取以下内容重新分组为 Bs Cs:

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

虽然期望得到:

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

下面是我使用的代码(对不起,长度,我确定有一个非常简化的版本)。

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

【问题讨论】:

  • 作为一般建议:几乎总是有比硬编码元素数量(在您的情况下是子列表的数量)更好的解决方案。如果您将其推广到未知数量的子列表,您的代码将更加灵活和可重用。

标签: python list nested loops


【解决方案1】:

按您的分组标准排序,然后使用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)]

演示:

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

您的输出要求有点复杂;如果返回分组元素的列表就足够了,在grouped 上调用list() 就足够了:

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

【讨论】:

    【解决方案2】:
         python 3.2
    
         [[[i] for i in v] for v in list1]
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-22
        • 2015-05-16
        相关资源
        最近更新 更多