我有一个具有不同长度字符串元素的NumPy数组(或Python列表):
array(['*,V*,UV,**,a2*,IR' , 'SB*,SB*,V*,UV,**,*,a2*,IR' , '*,V*,a2*' , ...])
每个元素都是一组用逗号分隔的缩写。如何在整个数组(列表)中找到所有不同的缩写及其计数?换句话说,我需要这样的东西:
在我的阵列中,V *被发现5次,IR - 7次等。最短的答案是值得赞赏的。
答案 0 :(得分:3)
将collections.Counter
与生成器表达式一起使用:
>>> from collections import Counter
>>> lis = ['*,V*,UV,**,a2*,IR' , 'SB*,V*,UV,**,*,a2*,IR' , '*,V*,a2*']
>>> Counter(y for x in lis for y in x.split(',') if '*' in y)
Counter({'V*': 3, '*': 3, 'a2*': 3, '**': 2, 'SB*': 1})
请注意,如果缩写表示glob pattern,则所有数组项实际上都是有效的glob模式,但目前我只计算包含至少一个'*'
的模式。如果不需要此类过滤,您可以删除if '*' in y
部分。
答案 1 :(得分:1)
你的'V *'出现3次,而不是5 ......
使用collections.Counter
,join
字符串列表,然后使用split
:
In [755]: ar=array(['*,V*,UV,**,a2*,IR' , 'SB*,V*,UV,**,*,a2*,IR' , '*,V*,a2*' ])
In [756]: from collections import Counter
In [757]: Counter(','.join(ar).split(','))
Out[757]: Counter({'*': 3, 'V*': 3, 'a2*': 3, 'UV': 2, 'IR': 2, '**': 2, 'SB*': 1})