Подтвердить что ты не робот

Как получить уникальные значения с соответствующим количеством совпадений из списка в Python?

У меня есть список повторяющихся элементов, и я хочу получить список уникальных элементов с их частотой.

Например, у меня есть ['a', 'a', 'b', 'b', 'b'], и я хочу [('a', 2), ('b', 3)].

Ищете простой способ сделать это, не повторяя дважды.

4b9b3361

Ответ 1

Если ваши элементы сгруппированы (т.е. похожие элементы объединяются в связку), наиболее эффективным методом является itertools.groupby:

>>> [(g[0], len(list(g[1]))) for g in itertools.groupby(['a', 'a', 'b', 'b', 'b'])]
[('a', 2), ('b', 3)]

Ответ 2

С Python 2. 7+ вы можете использовать collections.Counter.

В противном случае см. Этот счетчик рецепт.

Под Python 2. 7+:

from collections import Counter
input =  ['a', 'a', 'b', 'b', 'b']
c = Counter( input )

print( c.items() )

Выход:

[('a', 2), ('b', 3)]

Ответ 3

>>> mylist=['a', 'a', 'b', 'b', 'b']
>>> [ (i,mylist.count(i)) for i in set(mylist) ]
[('a', 2), ('b', 3)]

Ответ 4

"путь старой школы".

>>> alist=['a', 'a', 'b', 'b', 'b']
>>> d={}
>>> for i in alist:
...    if not d.has_key(i): d[i]=1  #also: if not i in d
...    else: d[i]+=1
...
>>> d
{'a': 2, 'b': 3}

Ответ 5

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

import numpy as np

L = ['a', 'a', 'b', 'b', 'b']

res = list(zip(*np.unique(L, return_counts=True)))

# [('a', 2), ('b', 3)]

Чтобы понять синтаксис, обратите внимание, что np.unique здесь возвращает набор уникальных значений и счетчиков:

uniq, counts = np.unique(L, return_counts=True)

print(uniq)    # ['a' 'b']
print(counts)  # [2 3]

Смотрите также: Каковы преимущества NumPy перед обычными списками Python?

Ответ 6

Я знаю, что это не один-лайнер... но мне это нравится, потому что мне ясно, что мы передаем начальный список значений один раз (вместо того, чтобы называть его счет):

>>> from collections import defaultdict
>>> l = ['a', 'a', 'b', 'b', 'b']
>>> d = defaultdict(int)
>>> for i in l:
...  d[i] += 1
... 
>>> d
defaultdict(<type 'int'>, {'a': 2, 'b': 3})
>>> list(d.iteritems())
[('a', 2), ('b', 3)]
>>>

Ответ 7

С помощью панд вы можете сделать так:

import pandas as pd
dict(pd.value_counts(my_list))

Ответ 8

Другой способ сделать это:

mylist = [1, 1, 2, 3, 3, 3, 4, 4, 4, 4]
mydict = {}
for i in mylist:
    if i in mydict: mydict[i] += 1
    else: mydict[i] = 1

то для получения списка кортежей

mytups = [(i, mydict[i]) for i in mydict]

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

Тем не менее, не очень красивый или лаконичный фрагмент кода, я соглашусь.

Ответ 9

Решение без хеширования:

def lcount(lst):
   return reduce(lambda a, b: a[0:-1] + [(a[-1][0], a[-1][1]+1)] if a and b == a[-1][0] else a + [(b, 1)], lst, [])

>>> lcount([])
[]
>>> lcount(['a'])
[('a', 1)]
>>> lcount(['a', 'a', 'a', 'b', 'b'])
[('a', 3), ('b', 2)]

Ответ 10

Преобразование любой структуры данных в серию pandas s:

CODE:

for i in sort(s.value_counts().unique()):
  print i, (s.value_counts()==i).sum()

Ответ 11

Здесь один из способов:

your_list = ['a', 'a', 'b', 'b', 'b']

count_dictionary = {}

for letter in your_list:

    if letter in count_dictionary:

        count_dictionary[letter] +=1 

    else:

        count_dictionary[letter] = 1