tôi muốn sử dụng một collections.Counter()
object để thu thập dài, sau đó tích lũy số tiền:
from collections import Counter
lengths = Counter(len(v) for v in userIdDict.values())
total = 0
accumulated = {}
for length in range(max(lengths), -1, -1):
count = lengths.get(length, 0)
total += count
accumulated[length] = total
Vì vậy, số lần thu thập này được tính cho mỗi độ dài, sau đó tạo từ điển có độ dài tích lũy. Đây là một thuật toán O (N); bạn lặp qua tất cả các giá trị một lần, sau đó thêm vào một số vòng nhỏ thẳng (ví max()
và vòng lặp tích lũy):
>>> from collections import Counter
>>> import random
>>> testdata = {''.join(random.choice('abcdefghijklmnopqrstuvwxyz') for _ in range(5)): [None] * random.randint(1, 10) for _ in range(100)}
>>> lengths = Counter(len(v) for v in testdata.values())
>>> lengths
Counter({8: 14, 7: 13, 2: 11, 3: 10, 4: 9, 5: 9, 9: 9, 10: 9, 1: 8, 6: 8})
>>> total = 0
>>> accumulated = {}
>>> for length in range(max(lengths), -1, -1):
... count = lengths.get(length, 0)
... total += count
... accumulated[length] = total
...
>>> accumulated
{0: 100, 1: 100, 2: 92, 3: 81, 4: 71, 5: 62, 6: 53, 7: 45, 8: 32, 9: 18, 10: 9}
Nguồn
2015-05-11 16:36:18