计算python列表中的单调项

时间:2019-02-10 12:34:58

标签: python

假设我有以下列表x = [1,2,3,3,2,0],并且我想计算单调项的数量(增加,减少和恒定)。因此,在我的示例中:

1. Increasing: [1,2], [2,3], [1,2,3]
2. Constant: [3,3]
3. Decreasing: [3,2], [2,0], [3,2,0]

总共7个项目。

先谢谢您。

2 个答案:

答案 0 :(得分:1)

由于您未显示任何代码,因此我只会给您一些提示。主要思想是从第二个项目(索引1)开始,逐步执行序列,并更新每个项目的信息,计算在该项目结束的单调序列的数量。

在浏览列表时,请存储几条信息。首先,您需要针对三种单调序列的计数器。无需分别计算序列的种类:您可以在一个计数器中将它们全部一起计数。您需要三向或四向信号来记录前​​一个单调序列的序列类型(递增,恒定或递减),并且需要一个整数来显示前一个单调序列的长度。使用该信息,您可以使用适当的数量更新适当的计数器。请注意,在存在任何种类的单调序列之前,您需要谨慎处理列表的开头。

现在从第二项(索引1)开始逐步浏览输入列表。将当前项目与上一个项目进行比较。更新当前单调序列的长度:如果最后两个项目的方向与先前的方向一致,则您的单调序列已经变大了一个项目;否则,您将拥有一个长度最小的新单调序列。现在,通过增加新的单调序列的数量来增加总体计数器。如果新序列的长度为2(先前项和当前项),则添加1;如果新序列的长度为3,则添加2,依此类推。

处理这些提示。如果您需要更多帮助,请显示更多工作并解释您遇到的困难,然后寻求更多帮助。但是您需要付出更多的努力。我已经按照这些提示编写了代码,它很好,有效且简短。编码愉快!


根据另一个回答者的看法,他认为您已经完成了足够的工作,这是我的代码。 (为了完整起见,我显示此代码-请不要从另一个答案中删除您的“接受”。)我包括两个可以轻易插入到主例程中的小函数,但是这些函数本身是有用的。

def pairwise(seq):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    if seq:
        return zip(seq, seq[1:])
    else:
        return zip()

def cmp(x, y):
    """Return an integer depending on the comparison of two values.
    Return -1 if x <  y, 
            0 if x == y,
            1 if x >  y.
    """
    return (x > y) - (y > x)  # a common Python trick: bool values to int

def count_monotonic_subsequences(seq):
    """Return the number of monotonic (consecutive) subsequences of
    length at least 2 in a sequence."""
    run_length = 0
    prev_cmp = None  # no comparisons done yet
    count_so_far = 0
    # For each item, add how many monotonic sequences end with that item
    for prev_item, item in pairwise(seq):
        this_cmp = cmp(prev_item, item)
        if this_cmp == prev_cmp:
            run_length += 1  # this item extends the previous mono subsequence
        else:
            run_length = 1  # this item begins a new monotonic subsequence
        prev_cmp = this_cmp
        count_so_far += run_length  # add new mono subsequences ending here
    return count_so_far

print(count_monotonic_subsequences([1,2,3,3,2,0])) # 7

答案 1 :(得分:-1)

通过将问题分解为更小的步骤来解决此问题要容易得多。首先,通过跟踪先前值和当前值,将项目按趋势进行分组(递增,相等或递减)。
收集所有结果,然后根据需要将结果分成较小的列表,以在第二步中获得所需的输出。

我鼓励您遵循代码中的注释并尝试自己执行这些步骤。

REQUEST_INSTALL_PACKAGE