Python列表遍历有差距

时间:2012-11-29 19:44:15

标签: python

您好我有一个多维列表,例如:

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

其中0表示两个数据之间的间隙。

我需要做的是遍历列表并跟踪每个子列表中有多少间隙并丢弃零。我认为最好的方法是将每个子列表分成具有零的块,这样我最终会得到较小的整数列表和一些间隙。理想情况下,要形成一个新的列表,告诉我每个块的长度和间隙的数量(即块-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(块)。

修改 但是,前导零和尾随零并不代表差距。即[0,0,1,2]代表一个连续的块。

任何帮助都非常感激。

2 个答案:

答案 0 :(得分: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],因此有两个块(一个间隙)。这符合您的第二种输出格式。

答案 1 :(得分: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:])