计算列表中的连续数字

时间:2017-01-31 22:46:51

标签: python list loops user-defined-functions

很抱歉,如果已经提出这个问题;我找不到一个类似于我能够得到满意答案的问题。

我对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

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

我希望在这种情况下我的输出看起来像这样:

[1,4,1,1,4]

如同,有一个单数,后跟4个连续数,后跟一个单数,后跟一个单数,后跟4个连续数。

我尝试了很多不同的方法,并且我已经获得了构建列表的功能,但所有元素都是1 ...

感谢您的帮助!

4 个答案:

答案 0 :(得分:1)

你可以采取这样的方法:

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

答案 1 :(得分:1)

您的代码存在一些问题,其中包括未定义的变量,或者使用列表中的元素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]

或者,您可以从每个元素中减去索引。这样,连续的连续元素将最终成为相同的元素。现在,您可以使用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]

答案 2 :(得分:0)

以下代码修复了它。您正在迭代列表本身的元素而不是您引用的计数器。

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))      

返回:

[1, 4, 1, 1, 4]

答案 3 :(得分:0)

这是我的版本

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

stat

您可以执行以下操作:

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