2

こんにちは、次のような多次元リストがあります。

my_list = [[1,2,3,1,2],[1,0,3,1,2],[1,0,0,0,2],[1,0,3,0,2]]

ここで、0 は 2 つのデータ間のギャップを表します。

私がする必要があるのは、リストを繰り返し処理し、各サブリストにいくつのギャップがあるかを追跡し、ゼロを捨てることです。最良の方法は、各サブリストをゼロがあるチャンクに分割することだと思うので、整数の小さなリストといくつかのギャップになります。理想的には、次のように、各チャンクの長さとギャップの数 (つまり、チャンク -1) を示す新しいリストを作成します。

new_list = [[5, 0], [[1, 3], 1], [[1, 1], 1], [[1, 1, 1], 2]]

またはおそらくより良い:

new_list = [[5], [1, 3], [1, 1], [1, 1, 1]]

ギャップが len(chunk) に等しいことがわかります。

編集: ただし、先頭と末尾のゼロはギャップを表していません。つまり、[0,0,1,2] は 1 つの連続したチャンクを表します。

どんな助けでも大歓迎です。

4

2 に答える 2

4

itertools.groupby()これに最適です:

from itertools import groupby
my_list = [[1,2,3,1,2],[1,0,3,1,2],[1,0,0,0,2],[1,0,3,0,2]]
new_list = [[len(list(g)) for k, g in groupby(inner, bool) if k] for inner in my_list]

結果:

>>> new_list
[[5], [1, 3], [1, 1], [1, 1, 1]]

結果には、各サブリストのゼロ以外の各チャンクの長さが含まれるため、たとえば[1,0,3,1,2]が返されるため[1,3]、2 つのチャンク (1 つのギャップ) が存在します。これは、2 番目の出力形式と一致します。

于 2012-11-29T19:48:19.797 に答える
1

インポートのない私の謙虚なコードは次のとおりです。

アルゴリズムは少し長いです:

def toggle(n):
    return n != 0



def chunk_counter(L):
    """
    list -> list
    """

    chunk_list = []
    pivots = []
    for j in range(len(L)):
        if j == 0 and toggle(L[0]):
            pivots.append(j)
        elif toggle(L[j]) and toggle(L[j]) != toggle(L[j-1]):
            pivots.append(j)

    for m in range(len(pivots)):
        k = 0
        if m == len(pivots)-1:
            bound = len(L)
        else:
            bound = pivots[m+1]

        p = 0
        while p in range(bound - pivots[m]):
            if toggle(L[pivots[m] + p]):
                    k += 1
                    p += 1
            else:
                p += 1
        chunk_list.append(k)

    return chunk_list        


    def chunks(L):
    """
    (list of lists) -> list of lists
    """

    new_list = []
    for i in range(len(L)):
        new_list.append(chunk_counter(L[i]))

    return new_list

したがって、chunks()リストで関数を試すことができます。

>>> L = [[1,2,3,1,2],[1,0,3,1,2],[1,0,0,0,2],[1,0,3,0,2], [0,0,1,2]]
>>> chunks(L)
[[5], [1, 3], [1, 1], [1, 1, 1], [2]]

以下は再帰的な定義です (Chunk Counter の代わり):

    counter_list = []
def counter(L):
    k = 0
    while(k < len(L) and L[k] != 0):
        k +=1
    counter_list.append(k)
    if k == len(L):
        print counter_list
    else:
    counter(L[k+1:])
于 2012-11-29T23:28:25.887 に答える