2013-04-07 40 views

Trả lời

14

Không, bạn sẽ cần xóa chúng theo cách thủ công. Sử dụng itertools.dropwhile() làm cho rằng một chút dễ dàng hơn có lẽ:

from itertools import dropwhile 

for key, count in dropwhile(lambda key_count: key_count[1] >= 15, main_dict.most_common()): 
    del main_dict[key] 

diễn:

>>> main_dict 
Counter({'baz': 20, 'bar': 15, 'foo': 10}) 
>>> for key, count in dropwhile(lambda key_count: key_count[1] >= 15, main_dict.most_common()): 
...  del main_dict[key] 
... 
>>> main_dict 
Counter({'baz': 20, 'bar': 15}) 

Bằng cách sử dụng dropwhile bạn chỉ cần kiểm tra các phím mà đếm là 15 trở lên; sau đó nó sẽ từ bỏ thử nghiệm và chỉ đi qua mọi thứ. Điều đó hoạt động tốt với danh sách được phân loại most_common(). Nếu có nhiều giá trị dưới 15, tiết kiệm thời gian thực hiện cho tất cả các thử nghiệm đó.

+0

Tôi không nhìn thấy điểm trong 'dropwhile' cho trường hợp này – jamylak

+0

Cũng' 'bar'' nên không bị xóa từ tần số của nó là không ít hơn 15. Trên thực tế ý tưởng này có thể làm việc trong một cách khác, nhưng không thực sự cho việc xóa khóa. ví dụ. 'new_dict = dict (trong khi đó (lambda x: x [1]> = 15, main_dict.most_common()))' – jamylak

+0

@jamylak: 'dropwhile' dừng kiểm tra khi nó ngừng khớp; cho một số lượng lớn các phím tạo nên sự khác biệt. Tôi sẽ điều tra lỗi sau. –

4

Một phương pháp:

c = Counter({'baz': 20, 'bar': 15, 'foo': 10}) 
print Counter(el for el in c.elements() if c[el] >= 15) 
# Counter({'baz': 20, 'bar': 15}) 
+0

Tại sao '.elements()' trên '.items()', sau này sẽ nhanh hơn – jamylak

+0

@jamylak Bởi vì '.emsems' trả về một tuple và khi được trả về' Counter' kết thúc bằng một tuple của cặp khóa/giá trị có giá trị là '1' (tôi nghĩ - đổ lỗi cho đêm khuya và ăn trưa quán rượu) –

+2

Được rồi, hoặc bạn cũng có thể làm điều này:' Số lượt truy cập ({k: c cho k, c trong c.items() nếu c> = 15}) ' – jamylak

6
>>> main_dict = Counter({'apple': 20, 'orange': 14, 'mango': 26, 'banana': 12}) 
>>> for k in list(main_dict): 
     if main_dict[k] < 15: 
      del main_dict[k] 


>>> main_dict 
Counter({'mango': 26, 'apple': 20}) 
0

tôi có thể đề nghị một giải pháp

from collections import Counter 
main_dict = Counter({'baz': 20, 'bar': 15, 'foo': 10}) 
trsh = 15 

main_dict = Counter(dict(filter(lambda x: x[1] >= trsh, main_dict.items()))) 
print(main_dict) 

>>> Counter({'baz': 20, 'bar': 15}) 

Ngoài ra tôi có cùng một vấn đề, nhưng tôi cần phải trả lại một danh sách của tất cả các phím từ Counter với các giá trị nhiều hơn một số ngưỡng. Để làm điều này

keys_list = map(lambda x: x[0], filter(lambda x: x[1] >= trsh, main_dict.items())) 
print(keys_list) 

>>> ['baz', 'bar'] 
Các vấn đề liên quan