计算列表中的连续数字

Counting consecutive numbers in a list

我找不到与我的问题足够相似的问题,无法得出满意的答案。

我是 Python (3.4.3) 的新手。我正在尝试通过将输入列表的每个元素与其中的下一个元素进行比较,使用 for 循环将元素添加到输出列表。

到目前为止,这是我的代码:

random_list=[1,4,5,6,7,9,19,21,22,23,24]

def count_consec(random_list):
    count=1
    consec_list=[]
    for i in listrand:
        if listrand[i] == listrand[i+1]+1:
            count+=1
        else:
            list.append(count)
    return consec_list

基本上,我想添加到 consec_list[] 值,这些值表示 random_list[] 中连续数字块的长度。

我希望我在这种情况下的输出如下所示:

[1,4,1,1,4]

如,单数1个,4个连续数,1个单数,1个单数,4个连续数

我尝试了很多不同的方法,我得到了构建列表的功能,但是所有元素都是1。

下面的代码解决了这个问题。您正在迭代列表本身的元素,而不是您引用的计数器。

random_list=[1,4,5,6,7,9,19,21,22,23,24]

def count_consec(listrand):
    count=1
    consec_list=[]
    for i in range(len(listrand[:-1])):
        if listrand[i]+1 == listrand[i+1]:
            count+=1
        else:
            consec_list.append(count)
            count=1

    # Account for the last iteration
    consec_list.append(count)     

    return consec_list

print(count_consec(random_list))      

Returns这个:

[1, 4, 1, 1, 4]

您可以采用这样的方法:

def countlist(random_list):
    retlist = []
    # Avoid IndexError for  random_list[i+1]
    for i in range(len(random_list) - 1):
        # Check if the next number is consecutive
        if random_list[i] + 1 == random_list[i+1]:
            count += 1
        else:
            # If it is not append the count and restart counting
            retlist.append(count)
            count = 1
    # Since we stopped the loop one early append the last count
    retlist.append(count)
    return retlist

您的代码存在一些问题,其中包括未定义的变量,或者使用列表中的元素 i 作为该元素的索引,但您也会遇到最后一个元素的索引错误,并且您永远不会将最后一次计数添加到结果列表中。

相反,我建议使用 zip(lst, lst[1:]) 方法迭代列表中的元素对,并使用 consec[-1] 访问和修改列表中已有的计数。

def count_consec(lst):
    consec = [1]
    for x, y in zip(lst, lst[1:]):
        if x == y - 1:
            consec[-1] += 1
        else:
            consec.append(1)
    return consec

random_list=[1,4,5,6,7,9,19,21,22,23,24]
print(count_consec(random_list))
# [1, 4, 1, 1, 4]

或者,您可以从每个元素中减去索引。这样,连续的连续元素最终将成为 same 元素。现在,您可以只使用 itertools.groupby 对这些元素进行分组和计数。

>>> random_list=[1,4,5,6,7,9,19,21,22,23,24]
>>> [e-i for i, e in enumerate(random_list)]
[1, 3, 3, 3, 3, 4, 13, 14, 14, 14, 14]
>>> [sum(1 for _ in g) for _, g in itertools.groupby(_)]
[1, 4, 1, 1, 4]

这是我的版本

假设你有一个数字列表,你想遍历它并计算连续的条纹:

list_of_nums = [4,5,7,8,2,1,3,5,7,6,8,9,9,9,2,2]

你可以这样做:

streak_count = []
counter = 1
for i in range(len(list_of_nums)):
    if i != (len(list_of_nums) - 1):
        diff = list_of_nums[i+1] - list_of_nums[i]
        if diff == 1:
            counter += 1
        else:
            streak_count.append(counter)
            counter = 1
    else:
        streak_count.append(counter)