Đó là một cách rất lạ để tổ chức mọi thứ. Nếu bạn lưu trữ trong từ điển, điều này rất dễ dàng:
# 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
Mã này để cập nhật từ điển số đếm là một "mẫu" phổ biến trong Python. Nó phổ biến đến mức có một cấu trúc dữ liệu đặc biệt defaultdict
, được tạo ra chỉ để làm cho việc này trở nên dễ dàng hơn:
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
Nếu bạn truy cập vào khóa defaultdict
bằng cách sử dụng một khóa và khóa chưa có trong khóa defaultdict
, khóa sẽ tự động được thêm vào với một giá trị mặc định. Hàm defaultdict
lấy giá trị có thể gọi mà bạn đã chuyển vào và gọi nó để nhận giá trị mặc định. Trong trường hợp này, chúng tôi đã vượt qua trong lớp int
; khi Python gọi int()
nó sẽ trả về giá trị 0. Vì vậy, lần đầu tiên bạn tham chiếu đến một URL, số lượng của nó được khởi tạo bằng 0 và sau đó bạn thêm một URL vào số lượng.
Nhưng một từ điển đầy số đếm cũng là một mẫu phổ biến, vì vậy Python cung cấp một lớp sẵn sàng để sử dụng: containers.Counter
Bạn chỉ cần tạo một Counter
thể hiện bằng cách gọi lớp, truyền vào bất kỳ lớp nào có thể lặp lại; nó xây dựng một từ điển trong đó các khóa là giá trị từ có thể lặp lại và các giá trị là số lần khóa xuất hiện trong có thể lặp lại. Ví dụ trên sau đó trở thành:
from collections import Counter # available in Python 2.7 and newer
urls_d = Counter(list_of_urls)
Nếu bạn thực sự cần làm theo cách bạn đã trình bày, cách dễ nhất và nhanh nhất là sử dụng bất kỳ một trong ba ví dụ này, sau đó xây dựng một ví dụ bạn cần.
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()]
Nếu bạn đang sử dụng Python 2.7 hoặc mới hơn, bạn có thể làm điều đó trong một lớp lót:
from collections import Counter
urls = [{"url": key, "nbr": value} for key, value in Counter(list_of_urls).items()]