2

リストを反復処理しようとしていますが、いくつかの条件に応じて、リスト内のアイテムをサブリストに再配置します。すべて元のリスト内にあります。Python で以下のコードを使用すると、list1 は 0、1、および 2 をグループ化して正しく出力されます。

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

2 番目のリストですべてが混同され、さらにサブリストとして 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();
4

3 に答える 3

3

グループ化基準で並べ替えてから、次を使用します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']]]

出力要件は少し複雑です。グループ化された要素のリストを返すだけで十分な場合は、list()ongroupedを呼び出すだけで十分です。

>>> [list(grouped) for group, grouped in groupby(sorted(input, key=key), key)]
[['A0', 'B0', 'C0'], ['A1', 'B1', 'C1'], ['A2', 'B2', 'C2']]
于 2012-11-22T17:15:16.817 に答える
1
     python 3.2

     [[[i] for i in v] for v in list1]
于 2012-12-12T17:26:44.110 に答える
0

more_itertools.chunkediterable と chunk size を受け入れる を考えてみましょう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']]]
于 2016-12-03T03:08:47.610 に答える