আনর্ডারড তালিকায় থাকা উপাদানগুলির ফ্রিকোয়েন্সি কীভাবে গণনা করবেন?


237

একটি আনর্ডারড তালিকায় উপাদানগুলির ফ্রিকোয়েন্সি আমার সন্ধান করতে হবে

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]

তারা সর্বদা উদাহরণ হিসাবে মত আদেশ করা হয়?
ফারহিনহা

@Peter। হ্যাঁ, আপনি পোস্ট করার উদ্দেশ্যে তালিকাটি বাছাই করেছেন। তালিকাটি কি সর্বদা বাছাই করা হবে?
এস .লট

2
না, তালিকাটি সর্বদা বাছাই করা হবে না। এটি হোমওয়ার্ক নয়।
ব্রুস

আমি একটি নেটওয়ার্কের ডিগ্রি বিতরণের গ্রাফ প্লট করার চেষ্টা করছি।
ব্রুস

5
@ পিটার: আপনার তথ্যটি দরকারী তথ্য সহ আপডেট করুন। দয়া করে আপনার প্রশ্নে মন্তব্যগুলি যুক্ত করবেন না - আপনি নিজেরাই প্রশ্নটির মালিক হন, আপনি এটি সম্পূর্ণ এবং পরিষ্কার হয়ে যেতে ঠিক করতে পারেন।
এস .লট

উত্তর:


147

দ্রষ্টব্য: ব্যবহারের আগে আপনার তালিকাটি বাছাই করা উচিত 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। এর দক্ষতা বনাম
ডিক্ট

32
পাইথন গ্রুপবাই নতুন গোষ্ঠী তৈরি করে যখন মানটি পরিবর্তন দেখায়। এই ক্ষেত্রে 1,1,1,2,1,1,1] [3,1,3] ফিরে আসত। যদি আপনি [,,১] প্রত্যাশা করে থাকেন তবে গ্রুপবাই ব্যবহারের আগে কেবল ডেটা সাজানোর বিষয়ে নিশ্চিত হন।
ইভান

4
@CristianCiupitu: sum(1 for _ in group)
মার্টিজন পিটারস

6
এটি কোনও সমাধান নয়। আউটপুটটি কী গণনা করা হয়েছিল তা বলে না।
বুটজ

8
[(key, len(list(group))) for key, group in groupby(a)]বা {key: len(list(group)) for key, group in groupby(a)}@ বিভটজ
এরিক পাউলি

532

পাইথন ২.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 বা তার বেশি বয়সী ব্যবহার করেন তবে আপনি এটি এখানে ডাউনলোড করতে পারেন ।


1
@ ইউন্টবু: আমার যদি তিনটি তালিকা থাকে, ক, খ, সি যার জন্য ক এবং খ একই থাকে, তবে সি পরিবর্তন হয়? গ এর মান কীভাবে গুন যার জন্য a এবং c সমান?
দ্য প্রিডেটর

@ শ্রীভাতসান: পরিস্থিতি আমি বুঝতে পারছি না। দয়া করে একটি নতুন প্রশ্ন পোস্ট করুন যেখানে আপনি বিস্তারিত বলতে পারবেন can
unutbu

1
কাউন্টার অবজেক্ট থেকে {1: 4, 2: 4, 3: 2, 5: 2, 4: 1 the অভিধানটি বের করার কোনও উপায় আছে কি?
প্যাভান

7
@ পাভান: collections.Counterএর একটি সাবক্লাস dict। আপনি এটি একইভাবে ব্যবহার করতে পারেন আপনি যেমন কোনও সাধারণ ডিক্ট করেন। আপনি যদি সত্যিই ডিক চান, তবে আপনি এটি ব্যবহার করে ডিকিতে রূপান্তর করতে পারেন dict(counter)
unutbu

1
3.6-এও কাজ করে, সুতরাং 2.7
kpierce8

108

পাইথন ২.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]

এটি মূল প্রশ্নটির মতো পূর্ণসংখ্যার বিপরীতে স্ট্রিংগুলির তালিকাগুলি সহ সত্যিই ভাল কাজ করে।
গ্লেন সেল

15
এটি একটি সেটটি দ্রুত ব্যবহার করছে:{x:a.count(x) for x in set(a)}
স্টেনসি

45
এটি বিশালভাবে অদক্ষa.count()একটি করে পূর্ণ ঢুকা প্রতিটি উপাদানের জন্য aএই একটি হে (ঢ ^ 2) quadradic পদ্ধতির উপার্জন। collections.Counter()এটি অনেক বেশি দক্ষ কারণ এটি রৈখিক সময়ের (ও (এন)) গণনা করে। সংখ্যায়, এর অর্থ এই পদ্ধতির 1000 দৈর্ঘ্যের তালিকার জন্য 1 মিলিয়ন পদক্ষেপগুলি কার্যকর করা হবে, বনাম মাত্র 1000 ধাপ সহ Counter()10 ^ 12 পদক্ষেপ যেখানে তালিকার দশ মিলিয়ন আইটেমের জন্য কাউন্টার দ্বারা কেবল 10 ^ 6 প্রয়োজন হয়
মার্টিজন পিটারস

3
@ স্টেনসি: অবশ্যই, তবে a.count()সেখানে একটি সেট ব্যবহার করার দক্ষতা সম্পূর্ণরূপে বামন ব্যবহারের ভয়াবহতা ।
মার্টিজন পিটারস

2
@ মার্তিজন এটিকে আরও কয়েকবার ব্যবহারের আরও একটি কারণ তৈরি করেছে :)
স্টেঞ্চি

48

উপস্থিতির সংখ্যা গণনা করতে:

from collections import defaultdict

appearances = defaultdict(int)

for curr in a:
    appearances[curr] += 1

সদৃশ অপসারণ করতে:

a = set(a) 

1
সংগ্রহের জন্য +1। এছাড়াও, পাইথন 3.x এ, সংগ্রহগুলি দেখুন oun এটি কালেকশন.ডিফাল্টিক্টিক্ট (ইনট) হিসাবে একই।
হুগডব্রাউন

2
@hughdbrown, আসলে Counterএকাধিক সাংখ্যিক ধরনের ব্যবহার করতে পারেন floatবা Decimalশুধু না int
ক্রিশ্চিয়ান সিউপিতু

28

পাইথন ২.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]

1
ডিফল্ট ডিকের তুলনায় কাউন্টারটি অনেক ধীর গতির হয় এবং ডিফল্ট ডিকটি কোনও ডিকের ম্যানুয়াল ব্যবহারের চেয়ে অনেক ধীর হয়।
জোনাথন রায়

@ জোনাথনরে, আর নয়, স্ট্যাকওভারফ্লো . com / a / 27802189 / 1382487
wsaleem

25

উপাদানের ফ্রিকোয়েন্সি গণনা করা সম্ভবত কোনও অভিধান দিয়ে সেরা করা হয়:

b = {}
for item in a:
    b[item] = b.get(item, 0) + 1

সদৃশগুলি অপসারণ করতে একটি সেট ব্যবহার করুন:

a = list(set(a))

3
@ ফকাহেলার: আমার থেকে এটির চেয়ে সামান্য কিছুটা ভাল হবে। যখন এটি একটি ছোট পরিবর্তন দিয়ে উন্নতি করা যায় তখন আমার আলাদা উত্তর পোস্ট করা খুব কমই মূল্যবান। এসও এর পয়েন্টটি সেরা উত্তরগুলি পাওয়া। আমি কেবল এটি সম্পাদনা করতে পারতাম, তবে আমি মূল লেখককে তাদের নিজস্ব উন্নতি করার সুযোগ দিতে পছন্দ করি।
এস .লট

1
@ এসলট কোডটি আমদানি না করেই অনেক পরিষ্কার defaultdict
bstrauch24

কেন নয় খ preinitialize: b = {k:0 for k in a}?
ডিলানইং

20

এখানে আরও একটি সাসিন্ট বিকল্প ব্যবহার করা হচ্ছে 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}

16

তুমি এটি করতে পারো:

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]

8
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'])

যদিও এই কোড স্নিপেট একটি সমাধান সহ সমাধান হতে পারে, সত্যিই আপনার পোস্টের গুণমান উন্নত করতে সহায়তা করে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, এবং সেই লোকেরা আপনার কোড পরামর্শের কারণগুলি জানেন না
রাহুল গুপ্ত

হ্যাঁ রাহুল গুপ্তা তা করবেন
অনিরবান লাহিড়ী

7
seta = set(a)
b = [a.count(el) for el in seta]
a = list(seta) #Only if you really want it.

4
তালিকা ব্যবহার countকরা হাস্যকরভাবে ব্যয়বহুল এবং এই দৃশ্যের জন্য অপ্রয়োজনীয়।
ইদান কে

@ ইদনকে গণনা ব্যয়বহুল কেন?
কৃত্তিকা রাজাইন

@ কৃতিকারাজাইন এই তালিকার প্রতিটি অনন্য উপাদানের জন্য আপনি একটি গণনা তৈরি করতে পুরো তালিকার উপরে পুনরাবৃত্তি করুন (তালিকার অনন্য উপাদানের সংখ্যায় চতুর্ভুজ)। পরিবর্তে, আপনি একবারে তালিকাটির পুনরাবৃত্তি করতে পারেন এবং প্রতিটি অনন্য উপাদানের সংখ্যা (তালিকার আকারে লিনিয়ার) গণনা করতে পারেন। আপনার তালিকায় যদি একটি মাত্র অনন্য উপাদান থাকে তবে ফলাফলটি একই রকম হয়। তদুপরি, এই পদ্ধতির জন্য একটি অতিরিক্ত মধ্যবর্তী সেট প্রয়োজন।
ডিলান ইয়ং

7

আমি কেবল নিম্নলিখিত পদ্ধতিতে 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


4

আপনার প্রথম প্রশ্নের জন্য, তালিকাটি পুনরাবৃত্তি করুন এবং কোনও উপাদানের উপস্থিতি ট্র্যাক রাখতে একটি অভিধান ব্যবহার করুন।

আপনার দ্বিতীয় প্রশ্নের জন্য, কেবল সেট অপারেটরটি ব্যবহার করুন।


4
আপনি কি দয়া করে প্রথম উত্তরটি বিস্তারিতভাবে বর্ণনা করতে পারেন
ব্রুস

3

এই উত্তর আরও সুস্পষ্ট

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}

3
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

3

আমি বেশ দেরি করে ফেলেছি তবে এটি কাজ করবে এবং অন্যকে সহায়তা করবে:

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

এটি উত্পাদন করবে ..

Freq  [4, 4, 2, 1, 2]
number[1, 2, 3, 4, 5]

2
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)
  1. সেট সংগ্রহটি সদৃশকে অনুমতি দেয় না, সেট () কনস্ট্রাক্টরকে একটি তালিকা পাস করা সম্পূর্ণ অনন্য অবজেক্টের একটি পুনরাবৃত্তিযোগ্য দেবে। তালিকায় থাকা কোনও বস্তু পাস করার পরে কাউন্ট () ফাংশনটি একটি পূর্ণসংখ্যা গণনা প্রদান করে। এর সাথে অনন্য অবজেক্টগুলি গণনা করা হয় এবং প্রতিটি কাউন্টের মান খালি তালিকার আউটপুট সংযোজন করে সংরক্ষণ করা হয়
  2. তালিকা () কনস্ট্রাক্টর সেট (ক) কে তালিকায় রূপান্তর করতে এবং একই ভেরিয়েবল এ দ্বারা উল্লিখিত ব্যবহৃত হয়

আউটপুট

D:\MLrec\venv\Scripts\python.exe D:/MLrec/listgroup.py
[4, 4, 2, 1, 2]
[1, 2, 3, 4, 5]

2

অভিধান ব্যবহার করে সহজ সমাধান

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())শেষ লুপ পরিবর্তন হবে না। এটি লুপে গণনা করবেন না, লুপের আগে এটি গণনা করুন ।
ডিলান ইউইং

1
#!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()

1
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)

2
দয়া করে কেবল কোড-উত্তর উত্তর পোস্ট করবেন না তবে আপনার কোডটি স্পষ্ট করুন, বিশেষত যখন কোনও প্রশ্নের ইতিমধ্যে বৈধ উত্তর রয়েছে।
এরিক এ

1
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

আমি একটি 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])

1

একটি ভারী কিন্তু শক্তিশালী গ্রন্থাগার - এনএলটিকে ব্যবহার করে এটি করার আরেকটি পদ্ধতি।

import nltk

fdist = nltk.FreqDist(a)
fdist.values()
fdist.most_common()

0

সংগ্রহগুলি ব্যবহার না করেই অন্য একটি অ্যালগরিদমের সাথে আরও একটি সমাধান:

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

0

আপনি পাইথনে প্রদত্ত অন্তর্নির্মিত ফাংশনটি ব্যবহার করতে পারেন

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


0

আপনি যদি কোনও লাইব্রেরি ব্যবহার না করে এটি সহজ এবং সংক্ষিপ্ত রাখতে না চান তবে এই পদ্ধতির চেষ্টা করা যেতে পারে!

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]

0

রেকর্ডের জন্য, একটি কার্যকরী উত্তর:

>>> 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)। আপনার নেতিবাচক সংখ্যা থাকলে আপনি অদ্ভুত ফলাফল পাবেন।


0

সেটগুলি ব্যবহার করে এটি করার আর একটি উপায় খুঁজে পাওয়া গেল।

#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)

0

তালিকায় অনন্য উপাদানগুলি সন্ধান করতে

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 রেফারেন্স


-1

আর একটি উপায় হ'ল ডিকশনারি এবং 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)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.