2013-12-16 3 views
0
source array: 
a1 = [1,2,2,2,3,4,] 
a2 = [3,5,6,7,8,8,] 
a3 = [3,4,7,8,9,9,] 
a4 = [2,3,5,7,8,9,] 

number  count 
    1   1 
    2   4 
    3   4 
    4   2 
    5   2 
    6   1 
    7   3 
    8   4 
    9   3 

Я хочу получить первые 4 порядка номеров по количеству. И вернитесь в тип списка. Результат будет [2,3,8,7] или [2,3,8,9].получить первые несколько позиций по вашему запросу

Я попытался использовать функцию массива в Python. Но найти его неэффективно. Поэтому я нашел numpy. Но я не знаком с numpy. Может ли кто-нибудь получить результат numpy? Или есть другой более эффективный способ?

+0

Почему я чувствую, что за последние пару дней этот вопрос был аскек, по крайней мере, полдюжины раз с одинаковыми ответы каждый раз! Используйте класс '' Counter'' :) –

+0

Извините, вы можете отметить * one * answer как принято. Рад, что вы нашли, что оба они полезны! –

ответ

0

В Numpy вариант, который будет только быстрее для очень больших массивов:

complete = np.concatenate((a1,a2,a3,a4)) 
uvals, uind = np.unique(complete, return_inverse=True) 
uvals[np.bincount(uind).argsort()[-4:]][::-1] 

array([8, 3, 2, 9]) 

Если вы должны иметь список, который вы можете использовать tolist() вариант:

uvals[np.bincount(uind).argsort()[-4:]][::-1].tolist() 

[8, 3, 2, 9] 
4

Использование collections.Counter() object здесь:

from collections import Counter 

counts = Counter(a1) 
for lst in (a2, a3, a4): 
    counts.update(lst) 

for number, count in counts.most_common(4): 
    print number, count 

Метод Counter.most_common() дает записи в порядке сортировки; здесь мы попросили 4 наиболее распространенных записи.

Если вы хотите, есть только список из 4-х цифр, использование:

top4 = [n for n, c in counts.most_common(4)] 

Вы также можете просто конкатенировать входные списки, но было бы лучше, если бы вы использовали itertools.chain для этого:

from collection import Counter 
from itertools import chain 

counts = Counter(chain(a1, a2, a3, a4)) 

и не создавать объект полного списка, который вы только отбросите.

Демо:

>>> from collections import Counter 
>>> a1 = [1,2,2,2,3,4,] 
>>> a2 = [3,5,6,7,8,8,] 
>>> a3 = [3,4,7,8,9,9,] 
>>> a4 = [2,3,5,7,8,9,] 
>>> counts = Counter(a1) 
>>> for lst in (a2, a3, a4): 
...  counts.update(lst) 
... 
>>> for number, count in counts.most_common(4): 
...  print number, count 
... 
2 4 
3 4 
8 4 
7 3 
>>> [n for n, c in counts.most_common(4)] 
[2, 3, 8, 7] 
Смежные вопросы