簡體   English   中英

識別列表中連續重復項的最 Pythonic 方法是什么?

[英]What's the most Pythonic way to identify consecutive duplicates in a list?

我有一個整數列表,我希望能夠識別連續的重復塊:也就是說,我想生成一個保持順序的重復列表,其中每個重復包含(int_in_question,出現次數)。

例如,如果我有一個類似的列表:

[0, 0, 0, 3, 3, 2, 5, 2, 6, 6]

我希望結果是:

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

我有一個相當簡單的方法,使用 for 循環、臨時和計數器:

result_list = []
current = source_list[0]
count = 0
for value in source_list:
    if value == current:
        count += 1
    else:
        result_list.append((current, count))
        current = value
        count = 1
result_list.append((current, count))

但我真的很喜歡 python 的函數式編程習慣,我希望能夠用一個簡單的生成器表達式來做到這一點。 但是,我發現在使用生成器時很難保持子計數。 我有一種感覺,一個兩步的過程可能會讓我到達那里,但現在我被難住了。

有沒有一種特別優雅/pythonic的方式來做到這一點,尤其是使用生成器?

>>> from itertools import groupby
>>> L = [0, 0, 0, 3, 3, 2, 5, 2, 6, 6]
>>> grouped_L = [(k, sum(1 for i in g)) for k,g in groupby(L)]
>>> # Or (k, len(list(g))), but that creates an intermediate list
>>> grouped_L
[(0, 3), (3, 2), (2, 1), (5, 1), (2, 1), (6, 2)]

正如他們所說,包括電池

JBernardo 中關於使用sum和 generator 表達式的建議; 見評論。

暫無
暫無

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

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