I need to find the frequency of elements in an unordered list
a = [1,1,1,1,2,2,2,2,3,3,4,5,5] output->
b = [4,4,2,1,2] 534 Answers
In Python 2.7 (or newer), you can use 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)] print(dict(counter)) # {1: 4, 2: 4, 3: 2, 5: 2, 4: 1} If you are using Python 2.6 or older, you can download it here.
6Note: You should sort the list before using groupby.
You can use groupby from itertools package if the list is an ordered list.
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)] Output:
[4, 4, 2, 1, 2] update: Note that sorting takes O(n log(n)) time.
11Python 2.7+ introduces Dictionary Comprehension. Building the dictionary from the list will get you the count as well as get rid of duplicates.
>>> 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] 8To count the number of appearances:
from collections import defaultdict appearances = defaultdict(int) for curr in a: appearances[curr] += 1 To remove duplicates:
a = set(a) 2In Python 2.7+, you could use collections.Counter to count items
>>> 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] 2Counting the frequency of elements is probably best done with a dictionary:
b = {} for item in a: b[item] = b.get(item, 0) + 1 To remove the duplicates, use a set:
a = list(set(a)) 5Here's another succint alternative using itertools.groupby which also works for unordered input:
from itertools import groupby items = [5, 1, 1, 2, 2, 1, 1, 2, 2, 3, 4, 3, 5] results = {value: len(list(freq)) for value, freq in groupby(sorted(items))} results
{1: 4, 2: 4, 3: 2, 4: 1, 5: 2} 0You can do this:
import numpy as np a = [1,1,1,1,2,2,2,2,3,3,4,5,5] np.unique(a, return_counts=True) Output:
(array([1, 2, 3, 4, 5]), array([4, 4, 2, 1, 2], dtype=int64)) The first array is values, and the second array is the number of elements with these values.
So If you want to get just array with the numbers you should use this:
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']) 2I would simply use scipy.stats.itemfreq in the following manner:
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] you may check the documentation here:
seta = set(a) b = [a.count(el) for el in seta] a = list(seta) #Only if you really want it. 3Data. Let's say we have a list:
fruits = ['banana', 'banana', 'apple', 'banana'] Solution. Then we can find out how many of each fruit we have in the list by doing this:
import numpy as np (unique, counts) = np.unique(fruits, return_counts=True) {x:y for x,y in zip(unique, counts)} Output:
{'banana': 3, 'apple': 1} This answer is more explicit
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} 1For your first question, iterate the list and use a dictionary to keep track of an elements existsence.
For your second question, just use the set operator.
1I am quite late, but this will also work, and will help others:
a = [1,1,1,1,2,2,2,2,3,3,4,5,5] freq_list = [] a_l = list(set(a)) for x in a_l: freq_list.append(a.count(x)) print 'Freq',freq_list print 'number',a_l will produce this..
Freq [4, 4, 2, 1, 2] number[1, 2, 3, 4, 5] 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 a = [1,1,1,1,2,2,2,2,3,3,4,5,5] # 1. Get counts and store in another list output = [] for i in set(a): output.append(a.count(i)) print(output) # 2. Remove duplicates using set constructor a = list(set(a)) print(a) - Set collection does not allow duplicates, passing a list to the set() constructor will give an iterable of totally unique objects. count() function returns an integer count when an object that is in a list is passed. With that the unique objects are counted and each count value is stored by appending to an empty list output
- list() constructor is used to convert the set(a) into list and referred by the same variable a
Output
D:\MLrec\venv\Scripts\python.exe D:/MLrec/listgroup.py [4, 4, 2, 1, 2] [1, 2, 3, 4, 5] 0Simple solution using a dictionary.
def frequency(l): d = {} for i in l: if i in d.keys(): d[i] += 1 else: d[i] = 1 for k, v in d.iteritems(): if v ==max (d.values()): return k,d.keys() print(frequency([10,10,10,10,20,20,20,20,40,40,50,50,30])) 1To find unique elements in the list:
a = [1,1,1,1,2,2,2,2,3,3,4,5,5] a = list(set(a)) To find the count of unique elements in a sorted array using dictionary:
def CountFrequency(my_list): # Creating an empty dictionary freq = {} for item in my_list: if (item in freq): freq[item] += 1 else: freq[item] = 1 for key, value in freq.items(): print ("% d : % d"%(key, value)) # Driver function if __name__ == "__main__": my_list =[1, 1, 1, 5, 5, 3, 1, 3, 3, 1, 4, 4, 4, 2, 2, 2, 2] CountFrequency(my_list) Reference:
4#!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() 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) 1from 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] To remove duplicates and Maintain order:
list(dict.fromkeys(get_count(a))) >>>[4, 2, 1] i'm using Counter to generate a freq. dict from text file words in 1 line of code
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]) Another approach of doing this, albeit by using a heavier but powerful library - NLTK.
import nltk fdist = nltk.FreqDist(a) fdist.values() fdist.most_common() Found another way of doing this, using sets.
#ar is the list of elements #convert ar to set to get unique elements sock_set = set(ar) #create dictionary of frequency of socks sock_dict = {} for sock in sock_set: sock_dict[sock] = ar.count(sock) For an unordered list you should use:
[a.count(el) for el in set(a)] The output is
[4, 4, 2, 1, 2] a = [1,1,1,1,2,2,2,2,3,3,4,5,5] d = {} [d.setdefault(el, []).append(1) for el in a] counts = {k: len(v) for k, v in d.items()} counts # {1: 4, 2: 4, 3: 2, 4: 1, 5: 2} Yet another solution with another algorithm without using collections:
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 You can use the in-built function provided in 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]) The above code automatically removes duplicates in a list and also prints the frequency of each element in original list and the list without duplicates.
Two birds for one shot ! X D
This approach can be tried if you don't want to use any library and keep it simple and short!
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]