簡體   English   中英

Python:確定列表中相等項的序列長度

[英]Python: determine length of sequence of equal items in list

我有一個列表如下:

l = [0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,2,2,2]

我想確定一系列相等項的長度,即對於給定的列表,我希望輸出為:

[(0, 6), (1, 6), (0, 4), (2, 3)]

(或類似的格式)。

我考慮使用defaultdict但它會計算每個項目的出現次數,並為整個列表累積它,因為我不能有多個鍵'0'。

現在,我的解決方案如下所示:

out = []
cnt = 0

last_x = l[0]  
for x in l:
    if x == last_x:
        cnt += 1
    else:
        out.append((last_x, cnt))
        cnt = 1
    last_x = x
out.append((last_x, cnt))

print out

我想知道是否有更多的pythonic方式來做到這一點。

你幾乎肯定想使用itertools.groupby

l = [0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,2,2,2]
answer = []
for key, iter in itertools.groupby(l):
    answer.append((key, len(list(iter))))

# answer is [(0, 6), (1, 6), (0, 4), (2, 3)]

如果您想提高內存效率,增加更多復雜性,可以添加一個長度函數:

def length(l):
    if hasattr(l, '__len__'):
        return len(l)
    else:
        i = 0
        for _ in l:
            i += 1
        return i

l = [0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,2,2,2]
answer = []
for key, iter in itertools.groupby(l):
    answer.append((key, length(iter)))

# answer is [(0, 6), (1, 6), (0, 4), (2, 3)]

請注意,雖然我沒有對length()函數進行基准測試,但它很可能會減慢你的速度。

邁克的答案很好,但是groupby返回的itertools._grouper永遠不會有__len__方法,所以沒有點測試它

我使用sum(1 for _ in i)來獲取itertools._grouper的長度

>>> import itertools as it
>>> L = [0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,2,2,2]
>>> [(k, sum(1 for _ in i)) for k, i in it.groupby(L)]
[(0, 6), (1, 6), (0, 4), (2, 3)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM