如何创建一个以列表的唯一项作为键并将唯一项的计数作为值的字典?

How to create a dictionary with the unique items of a list as key and the count of unique items as value?

我知道如果我有一本充满 x = {unique : count} 的字典,那么我可以使用 prop_dict = dict((k, round(v/sum(x.values()),2)) for k,v in x.items()),但我不知道如何从 array/list.

这是一些示例数据:

arr = [0., 137.,   3.,   1.,   1.,   5.,   2.,   2.,   8.,  31., 155.,
       3., 233.,  72., 302.,  66., 416.,   1., 148., 200., 237., 238.,
       354., 383., 422., 192.,  48.,  78., 136.,  15., 111.,   5.,  21.]

Python 有 collections.Counter class 可以为您解决这个问题:


In [1]: from collections import Counter                                                                                     

In [2]: arr = [0., 137.,   3.,   1.,   1.,   5.,   2.,   2.,   8.,  31., 155., 
   ...:        3., 233.,  72., 302.,  66., 416.,   1., 148., 200., 237., 238., 
   ...:        354., 383., 422., 192.,  48.,  78., 136.,  15., 111.,   5.,  21.]                                            

In [3]: Counter(arr)                                                                                                        
Out[3]: 
Counter({0.0: 1,
         137.0: 1,
         3.0: 2,
         1.0: 3,
         5.0: 2,
         2.0: 2,
         8.0: 1,
         31.0: 1,
         155.0: 1,
         233.0: 1,
         72.0: 1,
         302.0: 1,
         66.0: 1,
         416.0: 1,
         148.0: 1,
         200.0: 1,
         237.0: 1,
         238.0: 1,
         354.0: 1,
         383.0: 1,
         422.0: 1,
         192.0: 1,
         48.0: 1,
         78.0: 1,
         136.0: 1,
         15.0: 1,
         111.0: 1,
         21.0: 1})

告诉我这是否适合你:

arr = [0., 137.,   3.,   1.,   1.,   5.,   2.,   2.,   8.,  31., 155.,
       3., 233.,  72., 302.,  66., 416.,   1., 148., 200., 237., 238.,
       354., 383., 422., 192.,  48.,  78., 136.,  15., 111.,   5.,  21.]


def list_to_dict_unique(arr):
    """Convert a list of element in a dictionary with key the elemnt and value is the number of occurence
    """
    d = {}
    for i in arr:
        d[i] = d.get(i, 0) + 1
    return d


if "__main__" == __name__:
    print(list_to_dict_unique(arr))

结果:

{0.0: 1, 137.0: 1, 3.0: 2, 1.0: 3, 5.0: 2, 2.0: 2, 8.0: 1, 31.0: 1, 155.0: 1, 233.0: 1, 72.0: 1, 302.0: 1, 66.0: 1, 416.0: 1, 148.0: 1, 200.0: 1, 237.0: 1, 238.0: 1, 354.0: 1, 383.0: 1, 422.0: 1, 192.0: 1, 48.0: 1, 78.0: 1, 136.0: 1, 15.0: 1, 111.0: 1, 21.0: 1}

另一种方法:

l = [0., 137.,   3.,   1.,   1.,   5.,   2.,   2.,   8.,  31., 155.,
     3., 233.,  72., 302.,  66., 416.,   1., 148., 200., 237., 238.,
     354., 383., 422., 192.,  48.,  78., 136.,  15., 111.,   5.,  21.]

x = dict([x,l.count(x)] for x in set(l))

prop_dict = dict((k, round(v/sum(x.values()),2)) for k,v in x.items())
prop_dict

结果:

{0.0: 0.03,
 1.0: 0.09,
 2.0: 0.06,
 3.0: 0.06,
 5.0: 0.06,
 8.0: 0.03,
 15.0: 0.03,
 21.0: 0.03,
 31.0: 0.03,
 48.0: 0.03,
 66.0: 0.03,
 72.0: 0.03,
 78.0: 0.03,
 111.0: 0.03,
 136.0: 0.03,
 137.0: 0.03,
 148.0: 0.03,
 155.0: 0.03,
 192.0: 0.03,
 200.0: 0.03,
 233.0: 0.03,
 237.0: 0.03,
 238.0: 0.03,
 302.0: 0.03,
 354.0: 0.03,
 383.0: 0.03,
 416.0: 0.03,
 422.0: 0.03}

因为标签 pandas 让我们做 value_counts

d = pd.Series(arr).value_counts().to_dict()

Out[6]: 
{1.0: 3,
 3.0: 2,
 5.0: 2,
 2.0: 2,
 0.0: 1,
 237.0: 1,
 111.0: 1,
 15.0: 1,
 136.0: 1,
 78.0: 1,
 48.0: 1,
 192.0: 1,
 422.0: 1,
 383.0: 1,
 354.0: 1,
 238.0: 1,
 148.0: 1,
 200.0: 1,
 137.0: 1,
 416.0: 1,
 66.0: 1,
 302.0: 1,
 72.0: 1,
 233.0: 1,
 155.0: 1,
 31.0: 1,
 8.0: 1,
 21.0: 1}