как оптимально подсчитывать элементы в списке Python

Это почти тот же вопрос, что и здесь , за исключением того, что я спрашиваю о наиболее эффективном решении для отсортированного результата.

У меня есть список (около 10 целых чисел случайным образом от 0 до 12) , например:

the_list = [5, 7, 6, 5, 5, 4, 4, 7, 5, 4]

Я хочу создать функцию, которая возвращает список кортежей (элемент, количество), упорядоченных по первому элементу, например

output = [(4, 3), (5, 4), (6, 1), (7, 2)]

До сих пор я использовал:

def dupli(the_list):
    return [(item, the_list.count(item)) for item in sorted(set(the_list))]

Но я почти вызываю эту функцию миллион времени, и мне нужно сделать это так быстро, как я (питон). Поэтому мой вопрос: Как сделать эту функцию менее трудоемкой? (как насчет памяти?)

Я немного поигрался, но ничего очевидного не обнаружил:

from timeit import Timer as T
number=10000
setup = "the_list=[5, 7, 6, 5, 5, 4, 4, 7, 5, 4]"

stmt = "[(item, the_list.count(item)) for item in sorted(set(the_list))]"
T(stmt=stmt, setup=setup).timeit(number=number)

Out[230]: 0.058799982070922852

stmt = "L = []; \nfor item in sorted(set(the_list)): \n    L.append((item, the_list.count(item)))"
T(stmt=stmt, setup=setup).timeit(number=number)

Out[233]: 0.065041065216064453

stmt = "[(item, the_list.count(item)) for item in set(sorted(the_list))]"
T(stmt=stmt, setup=setup).timeit(number=number)

Out[236]: 0.098351955413818359

Спасибо

the_list = [5, 7, 6, 5, 5, 4, 4, 7, 5, 4]

Я хочу создать функцию, которая возвращает список кортежей (элемент, количество), упорядоченных по первому элементу, например

output = [(4, 3), (5, 4), (6, 1), (7, 2)]

До сих пор я использовал:

def dupli(the_list):
    return [(item, the_list.count(item)) for item in sorted(set(the_list))]

Но я вызываю эту функцию почти миллион раз и Мне нужно сделать это как можно быстрее (питон). Поэтому мой вопрос: Как сделать эту функцию менее трудоемкой? (как насчет памяти?)

Я немного поигрался, но ничего очевидного не обнаружилось:

from timeit import Timer as T
number=10000
setup = "the_list=[5, 7, 6, 5, 5, 4, 4, 7, 5, 4]"

stmt = "[(item, the_list.count(item)) for item in sorted(set(the_list))]"
T(stmt=stmt, setup=setup).timeit(number=number)

Out[230]: 0.058799982070922852

stmt = "L = []; \nfor item in sorted(set(the_list)): \n    L.append((item, the_list.count(item)))"
T(stmt=stmt, setup=setup).timeit(number=number)

Out[233]: 0.065041065216064453

stmt = "[(item, the_list.count(item)) for item in set(sorted(the_list))]"
T(stmt=stmt, setup=setup).timeit(number=number)

Out[236]: 0.098351955413818359

Спасибо

the_list = [5, 7, 6, 5, 5, 4, 4, 7, 5, 4]

Я хочу создать функцию, которая возвращает список кортежей (элемент, количество), упорядоченных по первому элементу, например

output = [(4, 3), (5, 4), (6, 1), (7, 2)]

До сих пор я использовал:

def dupli(the_list):
    return [(item, the_list.count(item)) for item in sorted(set(the_list))]

Но я вызываю эту функцию почти миллион раз и Мне нужно сделать это как можно быстрее (питон). Поэтому мой вопрос: Как сделать эту функцию менее трудоемкой? (как насчет памяти?)

Я немного поигрался, но ничего очевидного не обнаружилось:

from timeit import Timer as T
number=10000
setup = "the_list=[5, 7, 6, 5, 5, 4, 4, 7, 5, 4]"

stmt = "[(item, the_list.count(item)) for item in sorted(set(the_list))]"
T(stmt=stmt, setup=setup).timeit(number=number)

Out[230]: 0.058799982070922852

stmt = "L = []; \nfor item in sorted(set(the_list)): \n    L.append((item, the_list.count(item)))"
T(stmt=stmt, setup=setup).timeit(number=number)

Out[233]: 0.065041065216064453

stmt = "[(item, the_list.count(item)) for item in set(sorted(the_list))]"
T(stmt=stmt, setup=setup).timeit(number=number)

Out[236]: 0.098351955413818359

Спасибо
Кристоф

6
задан Community 23 May 2017 в 12:26
поделиться