2015-05-11 13 views
6

Nếu tôi có một dict của danh sách như:Làm thế nào để đếm kích thước của danh sách với một dict?

{ 
    'id1': ['a', 'b', 'c'], 
    'id2': ['a', 'b'], 
    # etc. 
} 

và tôi muốn để kiểm đếm kích thước của danh sách, tức là số id> 0,> 1,> 2 ... vv

.

có một cách dễ dàng hơn lồng cho vòng như thế này:

dictOfOutputs = {} 
for x in range(1,11): 
    count = 0 
    for agentId in userIdDict: 
     if len(userIdDict[agentId]) > x: 
      count += 1 
    dictOfOutputs[x] = count   
return dictOfOutputs 

Trả lời

2

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} 
0

Vâng, có một cách tốt hơn.

Đầu tiên, chỉ số id bởi chiều dài của dữ liệu của họ:

my_dict = { 
    'id1': ['a', 'b', 'c'], 
    'id2': ['a', 'b'], 
} 

from collections import defaultdict 
ids_by_data_len = defaultdict(list) 

for id, data in my_dict.items(): 
    my_dict[len(data)].append(id) 

Bây giờ, tạo dict của bạn:

output_dict = {} 
accumulator = 0 
# note: the end of a range is non-inclusive! 
for data_len in reversed(range(1, max(ids_by_data_len.keys()) + 1): 
    accumulator += len(ids_by_data_len.get(data_len, [])) 
    output_dict[data_len-1] = accumulator 

này có O (n) phức tạp hơn là O (n ²), vì vậy nó cũng nhanh hơn nhiều đối với các tập dữ liệu lớn.

Các vấn đề liên quan