मुझे एक अनियंत्रित सूची में तत्वों की आवृत्ति खोजने की आवश्यकता है
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
output->
b = [4,4,2,1,2]
इसके अलावा, मैं एक से डुप्लिकेट को दूर करना चाहता हूँ
a = [1,2,3,4,5]
मुझे एक अनियंत्रित सूची में तत्वों की आवृत्ति खोजने की आवश्यकता है
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
output->
b = [4,4,2,1,2]
इसके अलावा, मैं एक से डुप्लिकेट को दूर करना चाहता हूँ
a = [1,2,3,4,5]
जवाबों:
नोट: उपयोग करने से पहले आपको सूची को सॉर्ट करना चाहिए groupby
।
यदि सूची एक आदेशित सूची है तो आप पैकेज groupby
से उपयोग कर सकते हैं itertools
।
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]
groupby
। मुझे आश्चर्य है कि इसकी दक्षता बनाम तानाशाही दृष्टिकोण के बारे में, हालांकि
sum(1 for _ in group)
।
[(key, len(list(group))) for key, group in groupby(a)]
या {key: len(list(group)) for key, group in groupby(a)}
@buhtz
पायथन 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)]
यदि आप पाइथन 2.6 या अधिक पुराने का उपयोग कर रहे हैं, तो आप इसे यहाँ डाउनलोड कर सकते हैं ।
collections.Counter
का एक उपवर्ग है dict
। आप इसे उसी तरह से उपयोग कर सकते हैं जिस तरह से आप सामान्य तानाशाही करेंगे। यदि आप वास्तव में एक तानाशाही चाहते हैं, तो आप इसे एक तानाशाह के रूप में बदल सकते हैं dict(counter)
।
पायथन 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]
{x:a.count(x) for x in set(a)}
a.count()
एक पूर्ण पार करता है a
, जिससे यह O (N ^ 2) द्विघात दृष्टिकोण बन जाता है। collections.Counter()
है और अधिक कुशल क्योंकि यह रेखीय समय (ओ (एन)) में गिना जाता है। संख्याओं में, इसका अर्थ है कि यह दृष्टिकोण 1000 की लंबाई की सूची के लिए 1 मिलियन चरणों का निष्पादन करेगा, बनाम केवल 1000 चरणों के साथ Counter()
, 10 ^ 12 चरणों में जहां केवल 10 ^ 6 की आवश्यकता होती है काउंटर द्वारा एक सूची में एक लाख वस्तुओं के लिए, आदि
a.count()
पूरी तरह से उपयोग करने का डर वहाँ एक सेट का उपयोग करने की दक्षता को बौना करता है।
दिखावे की संख्या की गणना करने के लिए:
from collections import defaultdict
appearances = defaultdict(int)
for curr in a:
appearances[curr] += 1
डुप्लिकेट को निकालने के लिए:
a = set(a)
Counter
सहित कई संख्यात्मक प्रकारों का उपयोग कर सकता है । float
Decimal
int
पायथन 2.7+ में, आप आइटमों को गिनने के लिए संग्रहों का उपयोग कर सकते हैं
>>> 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]
तत्वों की आवृत्ति की गणना संभवतः एक शब्दकोश के साथ की जाती है:
b = {}
for item in a:
b[item] = b.get(item, 0) + 1
डुप्लिकेट को निकालने के लिए, एक सेट का उपयोग करें:
a = list(set(a))
defaultdict
।
b = {k:0 for k in a}
:?
यहां एक और रसीला विकल्प है itertools.groupby
जिसका उपयोग अनऑर्डर किए गए इनपुट के लिए भी किया जाता है:
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))}
परिणाम
{1: 4, 2: 4, 3: 2, 4: 1, 5: 2}
तुम यह केर सकते हो:
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'])
seta = set(a)
b = [a.count(el) for el in seta]
a = list(seta) #Only if you really want it.
count
इस परिदृश्य में सूचियों का उपयोग हास्यास्पद रूप से महंगा और अनकहा है।
मैं बस निम्नलिखित तरीके से scipy.stats.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
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)
उत्पादन
D:\MLrec\venv\Scripts\python.exe D:/MLrec/listgroup.py
[4, 4, 2, 1, 2]
[1, 2, 3, 4, 5]
शब्दकोश का उपयोग करते हुए सरल समाधान।
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]))
max(d.values())
अंतिम लूप में नहीं बदलेगा। इसे लूप में गणना न करें, लूप से पहले की गणना करें ।
#!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)
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])
ऐसा करने का एक और दृष्टिकोण, भारी लेकिन शक्तिशाली पुस्तकालय का उपयोग करके यद्यपि - एनएलटीके।
import nltk
fdist = nltk.FreqDist(a)
fdist.values()
fdist.most_common()
फिर भी संग्रह का उपयोग किए बिना दूसरे एल्गोरिथ्म के साथ एक और समाधान:
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
आप अजगर में प्रदान किए गए इन-बिल्ट फ़ंक्शन का उपयोग कर सकते हैं
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])
उपरोक्त कोड स्वचालित रूप से एक सूची में डुप्लिकेट को हटा देता है और मूल सूची और डुप्लिकेट के बिना सूची में प्रत्येक तत्व की आवृत्ति को प्रिंट करता है।
एक शॉट के लिए दो पक्षी! एक्सडी
यदि आप किसी भी पुस्तकालय का उपयोग नहीं करना चाहते हैं और इसे सरल और संक्षिप्त रखना चाहते हैं, तो इस दृष्टिकोण की कोशिश की जा सकती है!
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)
ओ / p
[4, 4, 2, 1, 2]
रिकॉर्ड के लिए, एक कार्यात्मक उत्तर:
>>> L = [1,1,1,1,2,2,2,2,3,3,4,5,5]
>>> import functools
>>> >>> functools.reduce(lambda acc, e: [v+(i==e) for i, v in enumerate(acc,1)] if e<=len(acc) else acc+[0 for _ in range(e-len(acc)-1)]+[1], L, [])
[4, 4, 2, 1, 2]
यदि आप शून्य को भी गिनें तो यह क्लीनर है:
>>> functools.reduce(lambda acc, e: [v+(i==e) for i, v in enumerate(acc)] if e<len(acc) else acc+[0 for _ in range(e-len(acc))]+[1], L, [])
[0, 4, 4, 2, 1, 2]
एक स्पष्टीकरण:
acc
सूची से शुरू करते हैं ;e
की L
के आकार की तुलना में कम है acc
, हम सिर्फ इस तत्व को अद्यतन: v+(i==e)
साधन v+1
अगर सूचकांक i
की acc
मौजूदा तत्व है e
, अन्यथा पिछले मानv
;e
की L
अधिक से अधिक है या के आकार के बराबर होती है acc
, हम विस्तार करने के लिए है acc
नई होस्ट करने के लिए 1
।तत्वों को छांटना नहीं है ( itertools.groupby
)। यदि आपके पास ऋणात्मक संख्या है, तो आपको अजीब परिणाम मिलेंगे।
ऐसा करने का एक और तरीका मिला, सेट का उपयोग करना।
#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)
सूची में अद्वितीय तत्वों को खोजने के लिए
a = [1,1,1,1,2,2,2,2,3,3,4,5,5]
a = list(set(a))
शब्दकोश का उपयोग करके एक क्रमबद्ध सरणी में अद्वितीय तत्वों की गिनती को खोजने के लिए
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)
संदर्भ GeeksforGeeks
एक और तरीका एक शब्दकोश और सूची का उपयोग करना है। इसे करने के लिए एक भोली तरीके से नीचे सूची।
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)
a=[1,2,3,4,5,1,2,3]
b=[0,0,0,0,0,0,0]
for i in range(0,len(a)):
b[a[i]]+=1