python - لغة - كود بايثون




كيف نحسب تواجدات عنصر القائمة؟ (12)

بالنظر إلى أحد العناصر ، كيف يمكنني احتساب تكراراته في قائمة في بايثون؟


بالنظر إلى أحد العناصر ، كيف يمكنني احتساب تكراراته في قائمة في بايثون؟

وهنا لائحة سبيل المثال:

>>> l = list('aaaaabbbbcccdde')
>>> l
['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'e']

list.count

هناك طريقة list.count

>>> l.count('b')
4

هذا يعمل بشكل جيد لأي قائمة. الصفات المميزة لها هذه الطريقة أيضًا:

>>> t = tuple('aabbbffffff')
>>> t
('a', 'a', 'b', 'b', 'b', 'f', 'f', 'f', 'f', 'f', 'f')
>>> t.count('f')
6

collections.Counter

ثم هناك مجموعات. يمكنك تفريغ أي كلمة قابلة للتكرار في عداد ، وليس مجرد قائمة ، وسيحتفظ العداد بهيكل بيانات أعداد العناصر.

الاستعمال:

>>> from collections import Counter
>>> c = Counter(l)
>>> c['b']
4

تعتمد العدادات على قواميس Python ، ومفاتيحها هي العناصر ، لذا يجب أن تكون المفاتيح قابلة للغسل. فهي في الأساس مثل مجموعات تسمح بعناصر زائدة عن الحاجة إليها.

مزيد من الاستخدام من collections.Counter

يمكنك إضافة أو طرح مع iterables من العداد الخاص بك:

>>> c.update(list('bbb'))
>>> c['b']
7
>>> c.subtract(list('bbb'))
>>> c['b']
4

ويمكنك القيام بعمليات متعددة مع العداد أيضاً:

>>> c2 = Counter(list('aabbxyz'))
>>> c - c2                   # set difference
Counter({'a': 3, 'c': 3, 'b': 2, 'd': 2, 'e': 1})
>>> c + c2                   # addition of all elements
Counter({'a': 7, 'b': 6, 'c': 3, 'd': 2, 'e': 1, 'y': 1, 'x': 1, 'z': 1})
>>> c | c2                   # set union
Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1, 'y': 1, 'x': 1, 'z': 1})
>>> c & c2                   # set intersection
Counter({'a': 2, 'b': 2})

لماذا لا الباندا؟

يقترح جواب آخر:

لماذا لا تستخدم الباندا؟

Pandas هي مكتبة شائعة ، ولكنها ليست في المكتبة القياسية. فإضافتها كتبعية غير تافهة.

هناك حلول مضمنة لحالة الاستخدام هذه في كائن القائمة نفسه وكذلك في المكتبة القياسية.

إذا كان مشروعك لا يتطلب بالفعل الباندا ، سيكون من الحماقة جعله مطلبًا فقط لهذه الوظيفة.


إذا كان بإمكانك استخدام pandas ، value_counts هناك value_counts .

>>> import pandas as pd
>>> a = [1, 2, 3, 4, 1, 4, 1]
>>> pd.Series(a).value_counts()
1    3
4    2
3    1
2    1
dtype: int64

يقوم تلقائيًا بفرز النتيجة بناءً على التردد أيضًا.

إذا كنت تريد أن تكون النتيجة في قائمة القائمة ، فقم بما يلي

>>> pd.Series(a).value_counts().reset_index().values.tolist()
[[1, 3], [4, 2], [3, 1], [2, 1]]

إذا كنت تستخدم Python 2.7 أو 3 وترغب في الحصول على عدد مرات التكرار لكل عنصر:

>>> from collections import Counter
>>> z = ['blue', 'red', 'blue', 'yellow', 'blue', 'red']
>>> Counter(z)
Counter({'blue': 3, 'red': 2, 'yellow': 1})

طريقة أخرى للحصول على عدد مرات حدوث كل عنصر ، في القاموس:

dict((i, a.count(i)) for i in a)

كان لدي هذه المشكلة اليوم وتوالت حل بلدي قبل اعتقدت للتحقق SO. هذه:

dict((i,a.count(i)) for i in a)

هو حقًا ، بطيء جدًا للقوائم الكبيرة. بلدي الحل

def occurDict(items):
    d = {}
    for i in items:
        if i in d:
            d[i] = d[i]+1
        else:
            d[i] = 1
return d

في الواقع أسرع قليلا من حل العداد ، على الأقل لبيثون 2.7.


لحساب عدد العناصر المتنوعة التي لها نوع شائع:

li = ['A0','c5','A8','A2','A5','c2','A3','A9']

print sum(1 for el in li if el[0]=='A' and el[1] in '01234')

يعطي

3 ، وليس 6


لماذا لا تستخدم الباندا؟

import pandas as pd

l = ['a', 'b', 'c', 'd', 'a', 'd', 'a']

# converting the list to a Series and counting the values
my_count = pd.Series(l).value_counts()
my_count

انتاج:

a    3
d    2
b    1
c    1
dtype: int64

إذا كنت تبحث عن إحصاء لعنصر معين ، قل ، حاول:

my_count['a']

انتاج:

3

يمكنك أيضًا استخدام طريقة countOf operator الوحدة النمطية المضمنة.

>>> import operator
>>> operator.countOf([1, 2, 3, 4, 1, 4, 1], 1)
3

عد تواجدات عنصر واحد في قائمة

لحساب تواجدات عنصر قائمة واحد فقط ، يمكنك استخدام count()

>>> l = ["a","b","b"]
>>> l.count("a")
1
>>> l.count("b")
2

يُعرف أيضًا حساب تكرارات كل العناصر الموجودة في القائمة باسم "تسجيل" قائمة أو إنشاء عداد رصيد.

حساب جميع العناصر ذات العدد ()

لحساب عدد مرات ظهور العناصر في الواحد ، يمكن ببساطة استخدام الفهم بالقائمة وطريقة count()

[[x,l.count(x)] for x in set(l)]

(أو بالمثل مع القاموس dict((x,l.count(x)) for x in set(l)) )

مثال:

>>> l = ["a","b","b"]
>>> [[x,l.count(x)] for x in set(l)]
[['a', 1], ['b', 2]]
>>> dict((x,l.count(x)) for x in set(l))
{'a': 1, 'b': 2}

حساب جميع العناصر باستخدام Counter ()

بدلاً من ذلك ، هناك فئة Counter أسرع من مكتبة collections

Counter(l)

مثال:

>>> l = ["a","b","b"]
>>> from collections import Counter
>>> Counter(l)
Counter({'b': 2, 'a': 1})

كم أسرع هو عداد؟

راجعت كم هو أسرع Counter للفرز قوائم. جربت كلا الطريقتين بقيم قليلة من n ويبدو أن Counter أسرع بعامل ثابت يبلغ 2 تقريبًا.

هنا هو البرنامج النصي اعتدت:

from __future__ import print_function
import timeit

t1=timeit.Timer('Counter(l)', \
                'import random;import string;from collections import Counter;n=1000;l=[random.choice(string.ascii_letters) for x in range(n)]'
                )

t2=timeit.Timer('[[x,l.count(x)] for x in set(l)]',
                'import random;import string;n=1000;l=[random.choice(string.ascii_letters) for x in range(n)]'
                )

print("Counter(): ", t1.repeat(repeat=3,number=10000))
print("count():   ", t2.repeat(repeat=3,number=10000)

و الإخراج:

Counter():  [0.46062711701961234, 0.4022796869976446, 0.3974247490405105]
count():    [7.779430688009597, 7.962715800967999, 8.420845870045014]

إذا كنت تريد حساب عنصر واحد فقط ، فاستخدم طريقة count :

>>> [1, 2, 3, 4, 1, 4, 1].count(1)
3

لا تستخدم هذا إذا كنت تريد حساب عناصر متعددة. يتطلب استدعاء count في حلقة ممر منفصل عبر القائمة لكل مكالمة count ، والتي يمكن أن تكون كارثية للأداء. إذا كنت تريد حساب جميع العناصر ، أو حتى عناصر متعددة ، فاستخدم Counter ، كما هو موضح في الإجابات الأخرى.


from collections import Counter
country=['Uruguay', 'Mexico', 'Uruguay', 'France', 'Mexico']
count_country = Counter(country)
output_list= [] 

for i in count_country:
    output_list.append([i,count_country[i]])
print output_list

قائمة الإخراج:

[['Mexico', 2], ['France', 1], ['Uruguay', 2]]

sum([1 for elem in <yourlist> if elem==<your_value>])

سيؤدي هذا إلى إرجاع عدد مرات حدوث your_value





count