【问题标题】:Trying to Find the First Ascending Run in a List Python尝试在列表 Python 中查找第一个升序运行
【发布时间】:2013-11-21 21:39:42
【问题描述】:

给定一个列表,例如 [4, 5, 5, 1, 8, 3, 1, 6, 2, 7] 我希望能够在列表中找到第一个升序运行.. 我想返回列表的起始位置和持续时间。所以这个列表将返回位置 0 并且长度是 2 (4,5)

如果列表中没有升序,则返回 -1。

以下是我到目前为止的内容,但我似乎无法修复运行程序时出现的“列表索引超出范围”错误。我知道为什么会出现错误,但不确定如何解决。

import random

def generate_integer_list (num_integers, low_range, high_range):
    assert num_integers > 0, "Value must be greater than 0"
    assert low_range < high_range, "Value must be less than high_range"

    x_range = range(num_integers) #Create a range for the below for-loop
    l = [] #Create an empty list

    #A for loop that goes on for the amount of integers the user wants and
    #generates a number within the bounds, then adds that number to the list we created above
    for _x in x_range:
        r = random.randint(low_range, high_range)

        l.append(r)

    print (l)

    length = len(l)
    for x in range(length   ):
        t = l[x+1] - l[x]

        if t == -1:
            print (True)
        else:
            print (False)


generate_integer_list (5, 0, 10)

我要问的是,如何让这个函数找到第一次提升并返回位置以及长度

【问题讨论】:

  • 您可能会发现itertools 模块和代码sublist == sorted(sublist) 很有用。
  • 如果您对itertools 解决方案感兴趣,here 组合运行模式可能会派上用场。

标签: python python-3.x


【解决方案1】:

应该这样做:

def solve(lis):
    run_length = 0
    ind = 0
    for i, (x, y) in enumerate(zip(lis, lis[1:])):
        if run_length and y-x != 1:
            break
        if y-x == 1:
            if not run_length:
                ind = i
            run_length += 1
    if run_length:
        return run_length+1, ind
    return -1

演示:

>>> solve([4, 5, 5, 1, 8, 3, 1, 6, 2, 7])
(2, 0)
>>> solve([1, 1, 1, 2, 3, 5, 1, 1])
(3, 2)
>>> solve([1, 1, 1, 1])
-1
>>> solve([1, 2, 5, 6, 7] )
(2, 0)
>>> solve([1, 0, -1, -2, -1, 0, 0])
(3, 3)

【讨论】:

  • 对 [1, 2, 5, 6, 7] 进行了尝试,我得到 (5,0) 不正确。任何想法如何解决这一问题?我现在正在尝试自己修复它。
  • @JacobMammoliti 不正确怎么办?您是否希望升序数字之间的差仅为 1?
  • 抱歉不清楚,它应该返回的是(2, 0)。长度应该代表提升的长度。编辑:当我的意思是提升时,我的意思是增加一。我为此道歉。
【解决方案2】:

您的代码存在三个问题:

  1. 您应该测试t 是否为正,而不是测试t == -1。在您给出的示例中,对于x=0t 将是 1,因此前两个元素是升序的。
  2. 你应该print(或returnFalse在循环之外。这样,您将在决定是否没有上升运行之前查看整个列表。
  3. 找到两个升序数字后,您需要开始计算运行持续了多长时间。

把这一切放在一起:

length = len(l)
run_started = False
for x in range(length-1):
    t = l[x+1] - l[x]
    if t > 0 :
        if run_started:
            run_length += 1
        else:
            run_started = True
            run_length = 2
    else:
        if run_started:
             print True
             print 'Run length:', run_length
             break
if not run_started:
    print False

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 2017-04-07
    相关资源
    最近更新 更多