2015-03-12 4 views
0

У меня есть sorted list. Например, my list является:Как подсчитать элементы между двумя значениями в отсортированном списке?

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

На самом деле, у меня есть список объектов моего класса с int property, на котором отсортированный список.

Я хочу рассчитать количество объектов, имеющих значение this property между two values.

Я ищу следующий эквивалент python.

int main() { 
    int myints[] = {10,20,30,30,20,10,10,20}; 
    std::vector<int> v(myints,myints+8);   // 10 20 30 30 20 10 10 20 

    std::sort (v.begin(), v.end());    // 10 10 10 20 20 20 30 30 

    std::vector<int>::iterator low,up; 
    low=std::lower_bound (v.begin(), v.end(), 20); //  ^
    up= std::upper_bound (v.begin(), v.end(), 20); //     ^

    std::cout << "lower_bound at position " << (low- v.begin()) << '\n'; 
    std::cout << "upper_bound at position " << (up - v.begin()) << '\n'; 

    std::cout << "MY_RESULT IS" << (up - v.begin()) - (low- v.begin()) << '\n'; 

    return 0; 
} 
+0

@Elizion, slise ли объекты копирования? – Denis

+0

копирует ссылки. – thebjorn

+0

Нарезка не будет работать, как если бы она ссылалась на индекс участника в списке, а не на значение свойства. Что относительно 'len ([i для i в my_list, если низкий

ответ

2

Я хотел бы использовать bisect модуль (, как он использует бинарный поиск, придав ему O (журнал N) сложность) взять биективности обеих сторон, например, так:

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

import bisect 

def find_ge(a, low, high): 
    i = bisect.bisect_left(a, low) 
    g = bisect.bisect_right(a, high) 
    if i != len(a) and g != len(a): 
     return a[i:g] 
    raise ValueError 

Выход:

>>>find_ge(my_list, 3, 6) 
[3, 4, 5, 6] 
+0

да, я тоже использую аналогичный код. Но я думал, что это не пуфонический путь. – Denis

+0

Модуль 'bisect' - отличный вариант на самом деле. – HavelTheGreat

Смежные вопросы