Найти количество раз, когда за числом следует большее число в списке

У меня есть эта функция, чтобы найти, сколько раз за числом следует большее число в списке. Есть ли другой более «питоновский» способ сделать это? Я использую Python 3.7.0.

Заранее спасибо.

def find_greater_numbers(arr):
    count = 0
    i = 0
    j = 1
    while i < len(arr):
        while j < len(arr):
            if arr[j] > arr[i]:
                count += 1
            j+=1
        j = i+1
        i+=1
    return count

find_greater_numbers([6,1,2,7]]) # returns 4

person johnsmithoptional    schedule 13.11.2018    source источник


Ответы (2)


Немного неясно, имеете ли вы в виду немедленное следование или следование в любом более позднем индексе

В первом случае это один лайнер:

sum(x < y for x,y in zip(arr[:-1],arr[1:])) # answer is 2

Во втором вот этот:

sum(any(x < y for y in arr[i:]) for i,x in enumerate(arr)) # answer is 3

И если вы хотите подсчитать количество точных таких пар (например, что делает ваш фактический код):

sum(x < y for i,x in enumerate(arr) for y in arr[i:]) # answer is 4
person Julien    schedule 13.11.2018
comment
Привет. Я имел в виду, что за ним следует большее число в любом более позднем индексе. Так, в примере списка [6,1,2,7] за 6 1 раз следует большее число, за 1 2 раза следует большее число, за 2 1 раз следует большее число (1+2+1= 4). Спасибо. - person johnsmithoptional; 13.11.2018

Используйте карту, чтобы получить список True/False для каждой пары чисел в списке в зависимости от условия, если x ‹ y. Этот список создается с помощью цикла for. Получив список, отфильтруйте число «Истина» в списке. Затем создайте один список с помощью функции itertools.chain.from_iterable() и найдите его длину.

import itertools

arr = [6, 1, 2, 7]
num = len(list(itertools.chain.from_iterable(list(filter(lambda x: x , map(lambda x, y: x<y, arr[:-i], arr[i:]))) for i, x in enumerate(arr))))
print(num)
person Rishabh Mishra    schedule 13.11.2018