Как подсчитать частоту элементов в списке?
мне нужно найти частоту элементов в список
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
выход->
b = [4,4,2,1,2]
также я хочу удалить дубликаты из
a = [1,2,3,4,5]
23 ответов
Так как список упорядочен вы можете сделать это:
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
from itertools import groupby
[len(list(group)) for key, group in groupby(a)]
выход:
[4, 4, 2, 1, 2]
в Python 2.7 (или новее), вы можете использовать collections.Counter
:
import collections
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
counter=collections.Counter(a)
print(counter)
# Counter({1: 4, 2: 4, 3: 2, 5: 2, 4: 1})
print(counter.values())
# [4, 4, 2, 1, 2]
print(counter.keys())
# [1, 2, 3, 4, 5]
print(counter.most_common(3))
# [(1, 4), (2, 4), (3, 2)]
Если вы используете Python 2.6 или старше, вы можете скачать его здесь.
Python 2.7 + вводит понимание словаря. Построение словаря из списка позволит вам подсчитать, а также избавиться от дубликатов.
>>> a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
>>> d = {x:a.count(x) for x in a}
>>> d
{1: 4, 2: 4, 3: 2, 4: 1, 5: 2}
>>> a, b = d.keys(), d.values()
>>> a
[1, 2, 3, 4, 5]
>>> b
[4, 4, 2, 1, 2]
чтобы подсчитать количество выступлений:
from collections import defaultdict
appearances = defaultdict(int)
for curr in a:
appearances[curr] += 1
удалить дубликаты:
a = set(a)
подсчет частоты элементов, вероятно, лучше всего делать со словарем:
b = {}
for item in a:
b[item] = b.get(item, 0) + 1
чтобы удалить дубликаты, используйте набор:
a = list(set(a))
в Python 2.7+ вы можете использовать сборники.Счетчик count элементов
>>> a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
>>>
>>> from collections import Counter
>>> c=Counter(a)
>>>
>>> c.values()
[4, 4, 2, 1, 2]
>>>
>>> c.keys()
[1, 2, 3, 4, 5]
вы можете сделать это:
import numpy as np
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
np.unique(a, return_counts=True)
выход:
(array([1, 2, 3, 4, 5]), array([4, 4, 2, 1, 2], dtype=int64))
первый массив-это значения, а второй массив-это количество элементов с этими значениями.
поэтому, если вы хотите получить только массив с номерами, вы должны использовать это:
np.unique(a, return_counts=True)[1]
from collections import Counter
a=["E","D","C","G","B","A","B","F","D","D","C","A","G","A","C","B","F","C","B"]
counter=Counter(a)
kk=[list(counter.keys()),list(counter.values())]
pd.DataFrame(np.array(kk).T, columns=['Letter','Count'])
Я бы просто использовал scipy.статистика.itemfreq следующим образом:
from scipy.stats import itemfreq
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
freq = itemfreq(a)
a = freq[:,0]
b = freq[:,1]
вы можете проверить документацию здесь: http://docs.scipy.org/doc/scipy-0.16.0/reference/generated/scipy.stats.itemfreq.html
для вашего первого вопроса повторите список и используйте словарь для отслеживания существования элементов.
для вашего второго вопроса просто используйте оператор set.
этот ответ более явные
a = [1,1,1,1,2,2,2,2,3,3,3,4,4]
d = {}
for item in a:
if item in d:
d[item] = d.get(item)+1
else:
d[item] = 1
for k,v in d.items():
print(str(k)+':'+str(v))
# output
#1:4
#2:4
#3:3
#4:2
#remove dups
d = set(a)
print(d)
#{1, 2, 3, 4}
def frequencyDistribution(data):
return {i: data.count(i) for i in data}
print frequencyDistribution([1,2,3,4])
...
{1: 1, 2: 1, 3: 1, 4: 1} # originalNumber: count
from collections import OrderedDict
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
def get_count(lists):
dictionary = OrderedDict()
for val in lists:
dictionary.setdefault(val,[]).append(1)
return [sum(val) for val in dictionary.values()]
print(get_count(a))
>>>[4, 4, 2, 1, 2]
удалить дубликаты и поддерживать порядок:
list(dict.fromkeys(get_count(a)))
>>>[4, 2, 1]
Я использую счетчик для генерации частоты. дикт из текстового файла слова в 1 строке кода
def _fileIndex(fh):
''' create a dict using Counter of a
flat list of words (re.findall(re.compile(r"[a-zA-Z]+"), lines)) in (lines in file->for lines in fh)
'''
return Counter(
[wrd.lower() for wrdList in
[words for words in
[re.findall(re.compile(r'[a-zA-Z]+'), lines) for lines in fh]]
for wrd in wrdList])
#!usr/bin/python
def frq(words):
freq = {}
for w in words:
if w in freq:
freq[w] = freq.get(w)+1
else:
freq[w] =1
return freq
fp = open("poem","r")
list = fp.read()
fp.close()
input = list.split()
print input
d = frq(input)
print "frequency of input\n: "
print d
fp1 = open("output.txt","w+")
for k,v in d.items():
fp1.write(str(k)+':'+str(v)+"\n")
fp1.close()
еще одно решение с другим алгоритмом без использования коллекций:
def countFreq(A):
n=len(A)
count=[0]*n # Create a new list initialized with '0'
for i in range(n):
count[A[i]]+= 1 # increase occurrence for value A[i]
return [x for x in count if x] # return non-zero count
num=[3,2,3,5,5,3,7,6,4,6,7,2]
print ('\nelements are:\t',num)
count_dict={}
for elements in num:
count_dict[elements]=num.count(elements)
print ('\nfrequency:\t',count_dict)
вы можете использовать встроенную функцию, предоставленную в python
l.count(l[i])
d=[]
for i in range(len(l)):
if l[i] not in d:
d.append(l[i])
print(l.count(l[i])
приведенный выше код автоматически удаляет дубликаты в списке, а также печатает частоту каждого элемента в исходном списке и списке без дубликатов.
две птицы за один выстрел ! X D
этот подход можно попробовать, если вы не хотите использовать любую библиотеку и держать его простым и коротким!
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
marked = []
b = [(a.count(i), marked.append(i))[0] for i in a if i not in marked]
print(b)
o / p
[4, 4, 2, 1, 2]
еще один способ-использовать словарь и список.граф, ниже наивный способ сделать это.
dicio = dict()
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
b = list()
c = list()
for i in a:
if i in dicio: continue
else:
dicio[i] = a.count(i)
b.append(a.count(i))
c.append(i)
print (b)
print (c)
str1='the cat sat on the hat hat'
list1=str1.split();
list2=str1.split();
count=0;
m=[];
for i in range(len(list1)):
t=list1.pop(0);
print t
for j in range(len(list2)):
if(t==list2[j]):
count=count+1;
print count
m.append(count)
print m
count=0;
#print m