Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

ตัวนับใน Python?


ตัวนับคือคอนเทนเนอร์ที่คอยติดตามว่ามีการเติมค่าที่เทียบเท่ากันกี่ครั้ง คลาสตัวนับ Python เป็นส่วนหนึ่งของโมดูลคอลเลกชันและเป็นคลาสย่อยของพจนานุกรม

ตัวนับหลาม

เราอาจคิดว่าตัวนับเป็นคอลเลกชันที่ไม่เรียงลำดับของรายการซึ่งรายการต่างๆ ถูกจัดเก็บเป็นคีย์พจนานุกรมและนับเป็นค่าพจนานุกรม

จำนวนรายการที่นับอาจเป็นจำนวนเต็มบวก ศูนย์ หรือจำนวนเต็มลบ แม้ว่าจะไม่มีการจำกัดคีย์และค่าของมัน แต่โดยทั่วไป ค่าต่างๆ จะเป็นตัวเลข แต่เราสามารถจัดเก็บวัตถุประเภทอื่นๆ ได้เช่นกัน

กำลังเริ่มต้น

ตัวนับรองรับการเริ่มต้นสามรูปแบบ ตัวสร้างสามารถเรียกได้ด้วยลำดับของรายการ พจนานุกรมที่มีคีย์และการนับ หรือใช้อาร์กิวเมนต์การแมปชื่อสตริงในการนับคำสำคัญ

import collections
print (collections.Counter(['a', 'b', 'c', 'a', 'b', 'b']))
print (collections.Counter({'a': 2, 'b': 3, 'c':1}))
print(collections.Counter(a=2, b=3, c=1))

ผลลัพธ์จากการเริ่มต้นทั้งสามรูปแบบจะเหมือนกัน -

Counter({'b': 3, 'a': 2, 'c': 1})
Counter({'b': 3, 'a': 2, 'c': 1})
Counter({'b': 3, 'a': 2, 'c': 1})

หากต้องการสร้างตัวนับว่าง ให้ส่งตัวนับโดยไม่มีอาร์กิวเมนต์และเติมข้อมูลโดยใช้วิธีการอัปเดต

import collections
c = collections.Counter()
print('Initial: ', c)
c.update('abcddcba')
print('Sequence: ', c)
c.update({'a': 1, 'd':5})
print('Dict: ', c)

ผลลัพธ์

Initial: Counter()
Sequence: Counter({'a': 2, 'b': 2, 'c': 2, 'd': 2})
Dict: Counter({'d': 7, 'a': 3, 'b': 2, 'c': 2})

จำนวนการเข้าถึง

เมื่อเติมตัวนับแล้ว จะสามารถดึงค่าผ่าน API พจนานุกรมได้

import collections
c = collections.Counter('abcddcba')
for letter in 'abcdef':
   print('%s : %d' %(letter, c[letter]))

ผลลัพธ์

a : 2
b : 2
c : 2
d : 2
e : 0
f : 0

ตัวนับไม่เพิ่ม KeyError สำหรับรายการที่ไม่รู้จัก (เช่นรายการ e &f ที่เรากล่าวถึงในโปรแกรมด้านบน) หากไม่เห็นค่าในอินพุต แสดงว่ามีค่าเป็น 0 (เช่น รายการที่ไม่รู้จัก e &f ในเอาต์พุตด้านบน)

องค์ประกอบ () วิธีการส่งกลับตัววนซ้ำที่สร้างรายการทั้งหมดที่ตัวนับรู้จัก

import collections
c = collections.Counter('Python Counters')
c['z'] = 0
print(c)
print(list(c.elements()))

ผลลัพธ์

Counter({'t': 2, 'o': 2, 'n': 2, 'P': 1, 'y': 1, 'h': 1, ' ': 1, 'C': 1, 'u': 1, 'e': 1, 'r': 1, 's': 1, 'z': 0})
['P', 'y', 't', 't', 'h', 'o', 'o', 'n', 'n', ' ', 'C', 'u', 'e', 'r', 's']

ลำดับขององค์ประกอบไม่คงที่ และไม่รวมรายการที่นับน้อยกว่าศูนย์

ในการผลิตอินพุตทั่วไปจาก n อินพุตและการนับตามลำดับ เราใช้ฟังก์ชัน most_common()

import collections
c = collections.Counter()
texts = '''Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in
reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa
qui officia deserunt mollit anim id est laborum.'''
for word in texts:
c.update(word.rstrip().lower())
print("Five most common letters in the texts: ")
for letter, count in c.most_common(5):
print("%s: %7d" %(letter, count))

ผลลัพธ์

Five most common letters in the texts:
i: 42
e: 38
t: 32
o: 29
u: 29

ตัวอย่างข้างต้นนับตัวอักษรที่ปรากฏในข้อความ (หรือคุณอาจพิจารณาเป็นไฟล์) เพื่อสร้างการกระจายความถี่ จากนั้นพิมพ์ห้าตัวอักษรที่พบบ่อยที่สุด การปล่อยให้อาร์กิวเมนต์เป็น most_common() จะสร้างรายการของรายการทั้งหมดตามลำดับความถี่

เลขคณิต

อินสแตนซ์ตัวนับรองรับการคำนวณและตั้งค่าการดำเนินการสำหรับการรวมผลลัพธ์

import collections
c1 = collections.Counter(['a', 'b', 'c', 'a' ,'b', 'b'])
c2 = collections.Counter('alphabet')
print('C1: ', c1)
print('C2: ', c2)
print ('\nCombined counts: ')
print(c1 + c2)
print('\nSubtraction: ')
print(c1 - c2)
print('\nIntersection (taking positive minimums): ')
print(c1 & c2)
print('\nUnion (taking maximums): ')
print(c1 | c2)

ผลลัพธ์

C1: Counter({'b': 3, 'a': 2, 'c': 1})
C2: Counter({'a': 2, 'l': 1, 'p': 1, 'h': 1, 'b': 1, 'e': 1, 't': 1})
Combined counts:
Counter({'a': 4, 'b': 4, 'c': 1, 'l': 1, 'p': 1, 'h': 1, 'e': 1, 't': 1})
Subtraction:
Counter({'b': 2, 'c': 1})
Intersection (taking positive minimums):
Counter({'a': 2, 'b': 1})
Union (taking maximums):
Counter({'b': 3, 'a': 2, 'c': 1, 'l': 1, 'p': 1, 'h': 1, 'e': 1, 't': 1})

ทุกครั้งที่มีการสร้างตัวนับใหม่ผ่านการดำเนินการ รายการใดๆ ที่มีค่าศูนย์หรือค่าลบจะถูกยกเลิก