นั่นเป็นวิธีการจัดระเบียบสิ่งของที่แปลกมาก หากคุณเก็บไว้ในพจนานุกรมสิ่งนี้ทำได้ง่าย:
# This example should work in any version of Python.
# urls_d will contain URL keys, with counts as values, like: {'http://www.google.fr/' : 1 }
urls_d = {}
for url in list_of_urls:
if not url in urls_d:
urls_d[url] = 1
else:
urls_d[url] += 1
รหัสสำหรับอัปเดตพจนานุกรมจำนวนนับนี้เป็น "รูปแบบ" ทั่วไปใน Python เป็นเรื่องปกติมากที่มีโครงสร้างข้อมูลพิเศษdefaultdict
สร้างขึ้นเพื่อให้ง่ายยิ่งขึ้น:
from collections import defaultdict # available in Python 2.5 and newer
urls_d = defaultdict(int)
for url in list_of_urls:
urls_d[url] += 1
หากคุณเข้าถึงdefaultdict
โดยใช้คีย์และคีย์ไม่ได้อยู่ในไฟล์defaultdict
คีย์จะถูกเพิ่มโดยอัตโนมัติด้วยค่าเริ่มต้น defaultdict
เตะ callable คุณผ่านและเรียกมันว่าจะได้รับค่าเริ่มต้น ในกรณีนี้เราผ่านในชั้นเรียนint
; เมื่อ Python เรียกint()
มันจะส่งกลับค่าศูนย์ ดังนั้นในครั้งแรกที่คุณอ้างอิง URL จำนวนของมันจะเริ่มต้นเป็นศูนย์จากนั้นคุณจะเพิ่มหนึ่งในการนับ
แต่พจนานุกรมที่เต็มไปด้วยจำนวนนับก็เป็นรูปแบบทั่วไปเช่นกันดังนั้น Python จึงจัดเตรียมคลาสที่พร้อมใช้งาน: containers.Counter
คุณเพียงแค่สร้างCounter
อินสแตนซ์โดยการเรียกคลาสโดยส่งผ่านไปยังสิ่งที่ทำซ้ำได้ มันสร้างพจนานุกรมโดยที่คีย์เป็นค่าจากการทำซ้ำและค่าจะนับจำนวนครั้งที่คีย์ปรากฏในการทำซ้ำ จากนั้นตัวอย่างข้างต้นจะกลายเป็น:
from collections import Counter # available in Python 2.7 and newer
urls_d = Counter(list_of_urls)
หากคุณจำเป็นต้องทำอย่างที่คุณแสดงจริงๆวิธีที่ง่ายและเร็วที่สุดคือใช้หนึ่งในสามตัวอย่างนี้จากนั้นสร้างแบบที่คุณต้องการ
from collections import defaultdict # available in Python 2.5 and newer
urls_d = defaultdict(int)
for url in list_of_urls:
urls_d[url] += 1
urls = [{"url": key, "nbr": value} for key, value in urls_d.items()]
หากคุณใช้ Python 2.7 หรือใหม่กว่าคุณสามารถทำได้ในซับเดียว:
from collections import Counter
urls = [{"url": key, "nbr": value} for key, value in Counter(list_of_urls).items()]