Μέτρηση του αριθμού των εμφανίσεων κάθε στοιχείου σε μια λίστα με τον Μετρητή της Python

Επιχείρηση

Στην Python, ο αριθμός όλων των στοιχείων μιας λίστας ή πλειάδας μπορεί να ληφθεί με τη χρήση της ενσωματωμένης συνάρτησης len() και ο αριθμός κάθε στοιχείου (ο αριθμός των εμφανίσεων κάθε στοιχείου) μπορεί να ληφθεί με τη χρήση της μεθόδου count().

Επιπλέον, η κλάση Counter της τυποποιημένης βιβλιοθήκης συλλογών της Python μπορεί να χρησιμοποιηθεί για να πάρει τα στοιχεία με τη σειρά του αριθμού των εμφανίσεων.

Σε αυτή την ενότητα, θα συζητήσουμε τα εξής

  • Μετρήστε το συνολικό αριθμό των στοιχείων:len()
  • Μετρήστε τον αριθμό κάθε στοιχείου (τον αριθμό των εμφανίσεων κάθε στοιχείου):count()
  • Χρήση.collections.Counter
  • Τα στοιχεία ανακτώνται κατά σειρά συχνότητας εμφάνισης:most_common()
  • Μετρήστε τον αριθμό (τύπο) των μη επικαλυπτόμενων στοιχείων (μοναδικά στοιχεία).
  • Μετρήστε τον αριθμό των στοιχείων που ικανοποιούν τη συνθήκη.

Επιπλέον, ως συγκεκριμένο παράδειγμα, εξηγούνται τα ακόλουθα με δείγμα κώδικα.

  • Μετράει τον αριθμό των εμφανίσεων μιας λέξης σε μια συμβολοσειρά.
  • Μετράει τον αριθμό των εμφανίσεων ενός χαρακτήρα σε μια συμβολοσειρά.

Το δείγμα είναι μια λίστα, αλλά η ίδια επεξεργασία μπορεί να γίνει και με πλειάδες.

Μέτρηση του συνολικού αριθμού των στοιχείων: len()

Για να μετρήσετε το συνολικό αριθμό των στοιχείων σε μια λίστα ή πλειάδα, χρησιμοποιήστε την ενσωματωμένη συνάρτηση len().

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

print(len(l))
# 7

Καταμέτρηση του αριθμού κάθε στοιχείου (ο αριθμός των εμφανίσεων κάθε στοιχείου): μέθοδος count()

Για να μετρήσετε τον αριθμό κάθε στοιχείου (τον αριθμό των εμφανίσεων κάθε στοιχείου), χρησιμοποιήστε τη μέθοδο count() για λίστες, πλειάδες κ.λπ.

Εάν μια τιμή που δεν υπάρχει ως στοιχείο περάσει ως όρισμα, επιστρέφεται 0.

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

print(l.count('a'))
# 4

print(l.count('b'))
# 1

print(l.count('c'))
# 2

print(l.count('d'))
# 0

Αν θέλετε να λάβετε τον αριθμό των εμφανίσεων κάθε στοιχείου ταυτόχρονα, είναι χρήσιμο το ακόλουθο collection.Counter.

Πώς να χρησιμοποιήσετε το collections.Counter

Οι συλλογές της τυπικής βιβλιοθήκης της Python διαθέτουν την κλάση Counter.

Η Counter() είναι μια υποκλάση του λεξικού τύπου dict, το οποίο έχει δεδομένα με τη μορφή στοιχείων ως κλειδιά και εμφανίσεων ως τιμές.

import collections

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

c = collections.Counter(l)
print(c)
# Counter({'a': 4, 'c': 2, 'b': 1})

print(type(c))
# <class 'collections.Counter'>

print(issubclass(type(c), dict))
# True

Εάν ένα στοιχείο καθορίζεται ως κλειδί, μπορεί να ληφθεί ο αριθμός των στοιχείων. Εάν καθοριστεί μια τιμή που δεν υπάρχει ως στοιχείο, επιστρέφεται 0.

print(c['a'])
# 4

print(c['b'])
# 1

print(c['c'])
# 2

print(c['d'])
# 0

Μπορείτε επίσης να χρησιμοποιήσετε μεθόδους τύπου λεξικού, όπως keys(), values(), items(), κ.λπ.

print(c.keys())
# dict_keys(['a', 'b', 'c'])

print(c.values())
# dict_values([4, 1, 2])

print(c.items())
# dict_items([('a', 4), ('b', 1), ('c', 2)])

Αυτές οι μέθοδοι επιστρέφουν αντικείμενα τύπου dict_keys, κ.λπ. Μπορούν να χρησιμοποιηθούν ως έχουν αν θέλετε να εκτελέσετε μια εντολή for. Αν θέλετε να τις μετατρέψετε σε λίστα, χρησιμοποιήστε την list().

Λήψη στοιχείων κατά σειρά συχνότητας εμφάνισης: μέθοδος most_common()

Ο μετρητής διαθέτει τη μέθοδο most_common(), η οποία επιστρέφει μια λίστα από πλειάδες της μορφής (στοιχείο, αριθμός εμφανίσεων) ταξινομημένες με βάση τον αριθμό των εμφανίσεων.

print(c.most_common())
# [('a', 4), ('c', 2), ('b', 1)]

Το στοιχείο με τον μεγαλύτερο αριθμό εμφανίσεων μπορεί να ληφθεί καθορίζοντας έναν δείκτη, όπως [0] για τον μεγαλύτερο αριθμό εμφανίσεων και [-1] για τον μικρότερο αριθμό εμφανίσεων. Αν θέλετε να λάβετε μόνο τα στοιχεία ή μόνο τον αριθμό εμφανίσεων, μπορείτε να καθορίσετε περαιτέρω τον δείκτη.

print(c.most_common()[0])
# ('a', 4)

print(c.most_common()[-1])
# ('b', 1)

print(c.most_common()[0][0])
# a

print(c.most_common()[0][1])
# 4

Αν θέλετε να τα ταξινομήσετε κατά φθίνοντα αριθμό εμφανίσεων, χρησιμοποιήστε το slice με το increment ορισμένο σε -1.

print(c.most_common()[::-1])
# [('b', 1), ('c', 2), ('a', 4)]

Εάν το όρισμα n καθορίζεται για τη μέθοδο most_common(), επιστρέφονται μόνο τα n στοιχεία με τον μεγαλύτερο αριθμό εμφανίσεων. Εάν παραλειφθεί, όλα τα στοιχεία.

print(c.most_common(2))
# [('a', 4), ('c', 2)]

Αν θέλετε μια ξεχωριστή λίστα των elements\occurrences ταξινομημένη με βάση τον αριθμό των εμφανίσεων, αντί για μια πλειάδα (στοιχείο, αριθμός εμφανίσεων), μπορείτε να την αναλύσετε ως εξής

values, counts = zip(*c.most_common())

print(values)
# ('a', 'c', 'b')

print(counts)
# (4, 2, 1)

Η ενσωματωμένη συνάρτηση zip() χρησιμοποιείται για την αντιμετάθεση μιας δισδιάστατης λίστας (στην προκειμένη περίπτωση, μιας λίστας πλειάδων) και, στη συνέχεια, για την αποσυμπίεση και την εξαγωγή της.

Μετρήστε τον αριθμό (τύπο) των μη επικαλυπτόμενων στοιχείων (μοναδικά στοιχεία).

Για να μετρήσετε πόσα μη επικαλυπτόμενα στοιχεία (μοναδικά στοιχεία) υπάρχουν σε μια λίστα ή πλειάδα (πόσοι τύποι υπάρχουν), χρησιμοποιήστε Counter ή set() όπως περιγράφεται παραπάνω.

Ο αριθμός των στοιχείων του αντικειμένου Counter είναι ίσος με τον αριθμό των μη επικαλυπτόμενων στοιχείων της αρχικής λίστας, ο οποίος μπορεί να ληφθεί με τη μέθοδο len().

l = ['a', 'a', 'a', 'a', 'b', 'c', 'c']
c = collections.Counter(l)

print(len(c))
# 3

Μπορείτε επίσης να χρησιμοποιήσετε τη set(), τον κατασκευαστή για τον τύπο set set, ο οποίος είναι ευκολότερος αν δεν χρειάζεστε ένα αντικείμενο Counter.

Ο τύπος συνόλου είναι ένας τύπος δεδομένων που δεν έχει διπλά στοιχεία. Η παράδοση μιας λίστας στη set() αγνοεί τις διπλές τιμές και επιστρέφει ένα αντικείμενο τύπου set με μόνο μοναδικές τιμές ως στοιχεία. Ο αριθμός των στοιχείων αυτού του τύπου λαμβάνεται από την len().

print(set(l))
# {'a', 'c', 'b'}

print(len(set(l)))
# 3

Μετρήστε τον αριθμό των στοιχείων που ικανοποιούν τη συνθήκη.

Για να μετρήσετε τον αριθμό των στοιχείων μιας λίστας ή πλειάδας που ικανοποιούν μια συγκεκριμένη συνθήκη, χρησιμοποιήστε τον συμβολισμό κατανόησης λίστας ή εκφράσεις γεννήτριας.

Για παράδειγμα, μετρήστε τον αριθμό των στοιχείων με αρνητικές τιμές για την ακόλουθη λίστα αριθμών

l = list(range(-5, 6))
print(l)
# [-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5]

Η εφαρμογή μιας έκφρασης υπό συνθήκη σε κάθε στοιχείο σε συμβολισμό κατανόησης λίστας δίνει μια λίστα της οποίας τα στοιχεία είναι Boolean bools (true, false). Ο Boolean τύπος bool είναι μια υποκατηγορία του ακέραιου τύπου int, όπου το true αντιμετωπίζεται ως 1 και το false ως 0. Επομένως, ο αριθμός των αληθών τιμών (ο αριθμός των στοιχείων που ικανοποιούν τη συνθήκη) μπορεί να μετρηθεί υπολογίζοντας το άθροισμα με τη χρήση της sum().

print([i < 0 for i in l])
# [True, True, True, True, True, False, False, False, False, False, False]

print(sum([i < 0 for i in l]))
# 5

Αν αντικαταστήσουμε το [] στον συμβολισμό κατανόησης λίστας με (), θα λάβουμε μια έκφραση γεννήτριας. Ο συμβολισμός κατανόησης λίστας παράγει μια λίστα με όλα τα στοιχεία που επεξεργάζεται, ενώ η έκφραση γεννήτρια επεξεργάζεται τα στοιχεία διαδοχικά και επομένως είναι πιο αποδοτική στη μνήμη.

Όταν η έκφραση γεννήτριας είναι το μοναδικό όρισμα, η () μπορεί να παραλειφθεί, οπότε μπορεί να γραφτεί όπως στην τελευταία περίπτωση.

print(sum((i < 0 for i in l)))
# 5

print(sum(i < 0 for i in l))
# 5

Αν θέλετε να μετρήσετε τον αριθμό των ψευδών τιμών (τον αριθμό των στοιχείων που δεν ικανοποιούν τη συνθήκη), χρησιμοποιήστε not. Σημειώστε ότι το > έχει μεγαλύτερη προτεραιότητα από το not (υπολογίζεται πρώτο), οπότε οι παρενθέσεις () στο (i < 0) στο ακόλουθο παράδειγμα δεν είναι απαραίτητες.

print([not (i < 0) for i in l])
# [False, False, False, False, False, True, True, True, True, True, True]

print(sum(not (i < 0) for i in l))
# 6

Φυσικά, οι ίδιες οι συνθήκες μπορούν να αλλάξουν.

print(sum(i >= 0 for i in l))
# 6

Ορισμένα άλλα παραδείγματα παρουσιάζονται παρακάτω.

Παράδειγμα εξαγωγής του αριθμού των περιττών στοιχείων μιας λίστας αριθμών.

print([i % 2 == 1 for i in l])
# [True, False, True, False, True, False, True, False, True, False, True]

print(sum(i % 2 == 1 for i in l))
# 6

Παράδειγμα συνθήκης για μια λίστα συμβολοσειρών.

l = ['apple', 'orange', 'banana']

print([s.endswith('e') for s in l])
# [True, True, False]

print(sum(s.endswith('e') for s in l))
# 2

Ο μετρητής χρησιμοποιείται για την καταμέτρηση με βάση τον αριθμό των εμφανίσεων. items() ανακτά μια πλειάδα (στοιχείο, αριθμός εμφανίσεων) και ο αριθμός των εμφανίσεων καθορίζει τη συνθήκη.

Ακολουθεί ένα παράδειγμα εξαγωγής στοιχείων με δύο ή περισσότερες εμφανίσεις και καταμέτρησης του συνολικού αριθμού εμφανίσεων. Σε αυτό το παράδειγμα, υπάρχουν τέσσερα a και δύο c, δηλαδή συνολικά έξι.

l = ['a', 'a', 'a', 'a', 'b', 'c', 'c']
c = collections.Counter(l)

print(c.items())
# dict_items([('a', 4), ('b', 1), ('c', 2)])

print([i for i in l if c[i] >= 2])
# ['a', 'a', 'a', 'a', 'c', 'c']

print([i[1] for i in c.items() if i[1] >= 2])
# [4, 2]

print(sum(i[1] for i in c.items() if i[1] >= 2))
# 6

Ακολουθεί ένα παράδειγμα εξαγωγής των τύπων των στοιχείων με δύο ή περισσότερες εμφανίσεις και καταμέτρησης του αριθμού των εμφανίσεων. Σε αυτό το παράδειγμα, υπάρχουν δύο τύποι, a και c.

print([i[0] for i in c.items() if i[1] >= 2])
# ['a', 'c']

print([i[1] >= 2 for i in c.items()])
# [True, False, True]

print(sum(i[1] >= 2 for i in c.items()))
# 2

Μετράει τον αριθμό των εμφανίσεων μιας λέξης σε μια συμβολοσειρά.

Ως συγκεκριμένο παράδειγμα, ας μετρήσουμε τον αριθμό των εμφανίσεων μιας λέξης σε μια συμβολοσειρά.

Αρχικά, αντικαταστήστε τα περιττά κόμματα και τελείες με ένα κενό αλφαριθμητικό χρησιμοποιώντας τη μέθοδο replace() και, στη συνέχεια, διαγράψτε τα. Στη συνέχεια, χρησιμοποιήστε τη μέθοδο split() για να δημιουργήσετε μια λίστα διαχωρισμένη με κενά.

s = 'government of the people, by the people, for the people.'

s_remove = s.replace(',', '').replace('.', '')

print(s_remove)
# government of the people by the people for the people

word_list = s_remove.split()

print(word_list)
# ['government', 'of', 'the', 'people', 'by', 'the', 'people', 'for', 'the', 'people']

Αν μπορείτε να φτιάξετε μια λίστα, μπορείτε να λάβετε τον αριθμό των φορών που εμφανίζεται κάθε λέξη, τους τύπους των λέξεων που εμφανίζονται και τη most_common() της collections.Counter για να λάβετε τη λέξη που εμφανίζεται τις περισσότερες φορές.

print(word_list.count('people'))
# 3

print(len(set(word_list)))
# 6

c = collections.Counter(word_list)

print(c)
# Counter({'the': 3, 'people': 3, 'government': 1, 'of': 1, 'by': 1, 'for': 1})

print(c.most_common()[0][0])
# the

Η παραπάνω διαδικασία είναι πολύ απλή, γι' αυτό είναι προτιμότερο να χρησιμοποιείτε βιβλιοθήκες όπως η NLTK για πιο σύνθετη επεξεργασία φυσικής γλώσσας.

Επίσης, στην περίπτωση ιαπωνικού κειμένου, η split() δεν μπορεί να χρησιμοποιηθεί για τον διαχωρισμό του κειμένου, επειδή δεν υπάρχει σαφής διαχωρισμός λέξεων. Για παράδειγμα, μπορείτε να χρησιμοποιήσετε τη βιβλιοθήκη Janome για να το πετύχετε αυτό.

Μετράει τον αριθμό των εμφανίσεων ενός χαρακτήρα σε μια συμβολοσειρά.

Δεδομένου ότι οι συμβολοσειρές είναι επίσης ένας τύπος ακολουθίας, μπορούν να χρησιμοποιηθούν με τη μέθοδο count() ή να περάσουν ως όρισμα στον κατασκευαστή της collections.Counter().

s = 'supercalifragilisticexpialidocious'

print(s.count('p'))
# 2

c = collections.Counter(s)

print(c)
# Counter({'i': 7, 's': 3, 'c': 3, 'a': 3, 'l': 3, 'u': 2, 'p': 2, 'e': 2, 'r': 2, 'o': 2, 'f': 1, 'g': 1, 't': 1, 'x': 1, 'd': 1})

Παράδειγμα ανάκτησης των 5 πιο συχνά εμφανιζόμενων χαρακτήρων.

print(c.most_common(5))
# [('i', 7), ('s', 3), ('c', 3), ('a', 3), ('l', 3)]

values, counts = zip(*c.most_common(5))

print(values)
# ('i', 's', 'c', 'a', 'l')
Copied title and URL