Đếm số lượng từ khóa trong từ điển bằng python


234

Tôi có một danh sách các từ trong từ điển có giá trị = sự lặp lại của từ khóa nhưng tôi chỉ muốn một danh sách các từ riêng biệt nên tôi muốn đếm số lượng từ khóa. Có cách nào để đếm số lượng từ khóa hay có cách nào khác để tôi tìm từ khác biệt không?

Câu trả lời:


410
len(yourdict.keys())

hoặc chỉ

len(yourdict)

Nếu bạn muốn đếm các từ duy nhất trong tệp, bạn có thể chỉ cần sử dụng setvà làm như

len(set(open(yourdictfile).read().split()))

4
Tôi biết bài này là cũ, nhưng tôi đã tò mò. Đây có phải là phương pháp nhanh nhất? Hoặc: nó là một phương pháp hợp lý nhanh chóng cho các từ điển lớn?
theJollySin

2
Cả hai len(yourdict.keys())len(yourdict)là O (1). Cái sau nhanh hơn một chút. Xem các thử nghiệm của tôi dưới đây.
Chih-Hsuan Yen

5
Tôi muốn lưu ý rằng bạn cũng có thể tìm kiếm các giá trị (tôi biết câu hỏi không được hỏi) vớilen(yourdict.values())
ntk4

29

Số lượng các từ riêng biệt (tức là số lượng mục trong từ điển) có thể được tìm thấy bằng cách sử dụng len()chức năng.

> a = {'foo':42, 'bar':69}
> len(a)
2

Để có được tất cả các từ riêng biệt (tức là các phím), hãy sử dụng .keys()phương thức.

> list(a.keys())
['foo', 'bar']

5

Gọi len()trực tiếp vào từ điển của bạn hoạt động, và nhanh hơn so với việc xây dựng một trình vòng lặp d.keys()và gọi len()nó, nhưng tốc độ của một trong hai sẽ không đáng kể so với bất cứ điều gì chương trình của bạn đang làm.

d = {x: x**2 for x in range(1000)}

len(d)
# 1000

len(d.keys())
# 1000

%timeit len(d)
# 41.9 ns ± 0.244 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

%timeit len(d.keys())
# 83.3 ns ± 0.41 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

2

Nếu câu hỏi là về việc đếm số lượng từ khóa thì sẽ đề xuất một cái gì đó như

def countoccurrences(store, value):
    try:
        store[value] = store[value] + 1
    except KeyError as e:
        store[value] = 1
    return

trong hàm chính có một cái gì đó lặp qua dữ liệu và truyền các giá trị cho hàm đếm số

if __name__ == "__main__":
    store = {}
    list = ('a', 'a', 'b', 'c', 'c')
    for data in list:
        countoccurrences(store, data)
    for k, v in store.iteritems():
        print "Key " + k + " has occurred "  + str(v) + " times"

Mã đầu ra

Key a has occurred 2 times
Key c has occurred 2 times
Key b has occurred 1 times

2
countoccurrences()Thay vào đó, các quy ước đặt tên PEP 8 ra lệnh phải thay thế count_occurrences(). Ngoài ra, nếu bạn nhập collections.Counter, có một cách tốt hơn để làm điều đó : from collections import Counter; store = Counter(); for data in list: store[list] += 1.
Graham

0

Một số sửa đổi đã được thực hiện trên câu trả lời được đăng tải UnderWaterKremlin để làm cho nó bằng chứng python3. Một kết quả đáng ngạc nhiên dưới đây là câu trả lời.

Thông số hệ thống:

  • trăn = 3.7.4,
  • conda = 4,8,0
  • 3.6Ghz, 8 lõi, 16gb.
import timeit

d = {x: x**2 for x in range(1000)}
#print (d)
print (len(d))
# 1000

print (len(d.keys()))
# 1000

print (timeit.timeit('len({x: x**2 for x in range(1000)})', number=100000))        # 1

print (timeit.timeit('len({x: x**2 for x in range(1000)}.keys())', number=100000)) # 2

Kết quả:

1) = 37,0100378

2) = 37.00214889999999595

Vì vậy, có vẻ như len(d.keys())hiện đang nhanh hơn so với chỉ sử dụng len().

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.