একটি আনর্ডারড তালিকায় উপাদানগুলির ফ্রিকোয়েন্সি আমার সন্ধান করতে হবে
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)}
@ বিভটজ
পাইথন ২.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)]
আপনি যদি পাইথন ২.6 বা তার বেশি বয়সী ব্যবহার করেন তবে আপনি এটি এখানে ডাউনলোড করতে পারেন ।
collections.Counter
এর একটি সাবক্লাস dict
। আপনি এটি একইভাবে ব্যবহার করতে পারেন আপনি যেমন কোনও সাধারণ ডিক্ট করেন। আপনি যদি সত্যিই ডিক চান, তবে আপনি এটি ব্যবহার করে ডিকিতে রূপান্তর করতে পারেন dict(counter)
।
পাইথন ২.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
এই একটি হে (ঢ ^ 2) quadradic পদ্ধতির উপার্জন। 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
।
পাইথন ২.7++ এ আপনি সংগ্রহগুলি ব্যবহার করতে পারেন 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]
উপাদানের ফ্রিকোয়েন্সি গণনা করা সম্ভবত কোনও অভিধান দিয়ে সেরা করা হয়:
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/references/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]
আমি একটি freq উত্পাদন করতে কাউন্টার ব্যবহার করছি। কোডের 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])
উপরের কোডটি স্বয়ংক্রিয়ভাবে একটি তালিকার সদৃশগুলি সরিয়ে দেয় এবং মূল তালিকার প্রতিটি উপাদানের ফ্রিকোয়েন্সি এবং নকল ছাড়াই তালিকার মুদ্রণ করে।
এক শটের জন্য দুটি পাখি! XD
আপনি যদি কোনও লাইব্রেরি ব্যবহার না করে এটি সহজ এবং সংক্ষিপ্ত রাখতে না চান তবে এই পদ্ধতির চেষ্টা করা যেতে পারে!
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)
GeeforforGeeks রেফারেন্স
আর একটি উপায় হ'ল ডিকশনারি এবং list.count ব্যবহার করার জন্য এটি একটি নিখুঁত পদ্ধতির নীচে।
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