【问题标题】:Print all integers that are greater than their left neighbor打印所有大于其左邻居的整数
【发布时间】:2018-08-04 21:40:23
【问题描述】:

(使用python 3)这是我被赋予的任务:

给定一个数字列表,找到并打印其所有大于其左邻居的元素。

示例输入

1 5 2 4 3

示例输出

5 4

这是我的代码:

# creates a list out of the input given as '# # # # # #...'
a = [int(s) for s in input().split()]

for i in a[1:]:               #skips the first since it has no "left neighbor"
   if i > a[a.index(i) - 1]:  #checks if 'i' is greater than element before 'i'
      print(i, end=' ')

我的问题是它适用于我所做的所有测试,除非我给它一个列表,a[0] == a[-1] 然后它会忽略列表中等于该整数的所有元素。

例如:

3 5 2 3 1 2 3 1 3
--> 5    

我一直很难找到错误!如果这个问题没有很好地提出,请原谅。这是我第一次在 stackoverflow 上提问。

【问题讨论】:

  • 函数 .index(a) 找到数组中第一个等于 a 的值,因此如果数组中的值不是唯一的,它将不起作用

标签: python python-3.x math integer python-3.6


【解决方案1】:

试试这个:

for i in range(1, len(a)):
    if a[i] > a[i-1]:
        print(a[i], end=' ')

结果:

3 5 2 3 1 2 3 1 3
--> 5 3 2 3 3

【讨论】:

  • for 循环从 i = 1 开始,所以应该没问题。
  • 不,先生,它不会。我不是从第 0 个索引开始循环。
  • 对不起,我没有注意到 1。
【解决方案2】:

使用filterlambda

lst = [3, 5, 2, 3, 1, 2, 3, 1, 3]

greater = [item[1] for item in filter(lambda x: x[1] > x[0], zip(lst, lst[1:]))]
print(greater)

产量

[5, 3, 2, 3, 3]

或者,作为@Roadrunner cmets(我的最爱!):

[y for x, y in zip(lst, lst[1:]) if y > x]

为了迷惑大众,你也可以编写自己的生成器函数:

def greater(iterable):
    ilst = iter(iterable)
    prev, current = None, next(ilst)
    while (ilst):
        if prev and current > prev:
            yield current
        prev, current = current, next(ilst)

greater_n = [g for g in greater(lst)]
print(greater_n)


计时(每次 100.000 次):
def mushif():
    lst = [3, 5, 2, 3, 1, 2, 3, 1, 3]
    greater = []
    for i in range(1, len(lst)):
        if lst[i] > lst[i-1]:
            greater.append(lst[i])

def jan():
    lst = [3, 5, 2, 3, 1, 2, 3, 1, 3]
    greater = [item[1] for item in filter(lambda x: x[1] > x[0], zip(lst, lst[1:]))]


def roadrunner():
    lst = [3, 5, 2, 3, 1, 2, 3, 1, 3]
    greater = [y for x, y in zip(lst, lst[1:]) if y > x]

import timeit

print(timeit.timeit(mushif, number=10**5))
print(timeit.timeit(jan, number=10**5))
print(timeit.timeit(roadrunner, number=10**5))

产量

0.37175918000139063
0.49957343799906084
0.2700801329992828

【讨论】:

  • 有理由比 mushif 更喜欢这种方法吗?我明白了,但如果我在生产和其他环境中发现这一点,肯定需要更多时间来理解。那么它更快吗?
  • 3 年后,我明白这是多么的微不足道!我现在肯定会去争取一份名单!
【解决方案3】:
a = [5, 2, 3, 1, 2, 3, 1, 3]
[a[i] for i in range(1,len(a)) if a[i] > a[i-1]]
# [5, 3, 2, 3, 3]

【讨论】:

    【解决方案4】:

    不使用zip 或每次按其索引访问元素的另一种解决方案

    prev, *lst = [3, 5, 2, 3, 1, 2, 3, 1, 3]
    greater = []
    for i in lst:
        if prev < i:
            greater.append(i)
        prev = i
    

    @Jan 提供的测试用例:

    def mushif(lst):
        greater = []
        for i in range(1, len(lst)):
            if lst[i] > lst[i-1]:
                greater.append(lst[i])
    
    def jan(lst):
        greater = [item[1] for item in filter(lambda x: x[1] > x[0], zip(lst, lst[1:]))]
    
    
    def roadrunner(lst):
        greater =   [y for x, y in zip(lst, lst[1:]) if y > x]
    
    def vishes_shell(lst):
        start, *lst = lst
        greater = []
        for i in lst:
            if start < i:
                greater.append(i)
            start = i
    
    import timeit, functools, random
    lst = [3, 5, 2, 3, 1, 2, 3, 1, 3]
    print('Runnig with {} elements'.format(lst))
    print('mushif', timeit.timeit(functools.partial(mushif, lst), number=10**5))
    print('jan', timeit.timeit(functools.partial(jan, lst), number=10**5))
    print('roadrunner', timeit.timeit(functools.partial(roadrunner, lst), number=10**5))
    print('vishes_shell', timeit.timeit(functools.partial(vishes_shell, lst), number=10**5))
    
    lst = [random.randint(1, 100) for _ in range(100)]
    print('Runnig with 100 elements')
    print('mushif', timeit.timeit(functools.partial(mushif, lst), number=10**5))
    print('jan', timeit.timeit(functools.partial(jan, lst), number=10**5))
    print('roadrunner', timeit.timeit(functools.partial(roadrunner, lst), number=10**5))
    print('vishes_shell', timeit.timeit(functools.partial(vishes_shell, lst), number=10**5))
    
    lst = [random.randint(1, 100) for _ in range(1000)]
    print('Runnig with 1000 elements')
    print('mushif', timeit.timeit(functools.partial(mushif, lst), number=10**5))
    print('jan', timeit.timeit(functools.partial(jan, lst), number=10**5))
    print('roadrunner', timeit.timeit(functools.partial(roadrunner, lst), number=10**5))
    print('vishes_shell', timeit.timeit(functools.partial(vishes_shell, lst), number=10**5))
    

    输出:

    Runnig with [3, 5, 2, 3, 1, 2, 3, 1, 3] elements
    mushif 0.22174075798830017
    jan 0.367339823016664
    roadrunner 0.16411117801908404
    vishes_shell 0.16474426098284312
    
    Runnig with 100 elements
    mushif 1.8483440639975015
    jan 2.6946504779916722
    roadrunner 0.8267438650073018
    vishes_shell 1.1597095750039443
    
    Runnig with 1000 elements
    mushif 21.29723681899486
    jan 26.859666333009955
    roadrunner 8.274298987002112
    vishes_shell 12.677083582995692
    

    如您所见,roadrunner 是最好的。

    【讨论】:

      【解决方案5】:
      from itertools import islice
      greater = [y for x,y in zip(a,islice(a,1,None)) if x < y]
      

      【讨论】:

      • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
      猜你喜欢
      • 1970-01-01
      • 2018-04-20
      • 2020-03-05
      • 2018-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      相关资源
      最近更新 更多