使用字典来计算列表中的项目数
- 2024-12-16 08:35:00
- admin 原创
- 149
问题描述:
假设我有一个项目列表,例如:
['apple', 'red', 'apple', 'red', 'red', 'pear']
我想要一本字典来计算每个项目在列表中出现的次数。因此,对于上面的列表,结果应该是:
{'apple': 2, 'red': 3, 'pear': 1}
我怎样才能用 Python 简单地做到这一点?
如果您只对计数列表中单个元素的实例感兴趣,请参阅如何计算列表项的出现次数?。
解决方案 1:
在 2.7 和 3.1 中,有用于此目的的特殊Counter
(子类)。dict
>>> from collections import Counter
>>> Counter(['apple','red','apple','red','red','pear'])
Counter({'red': 3, 'apple': 2, 'pear': 1})
解决方案 2:
我喜欢:
counts = dict()
for i in items:
counts[i] = counts.get(i, 0) + 1
如果键不存在,.get 允许您指定默认值。
解决方案 3:
只需使用列表属性 count\
i = ['apple','red','apple','red','red','pear']
d = {x:i.count(x) for x in i}
print d
输出 :
{'pear': 1, 'apple': 2, 'red': 3}
解决方案 4:
>>> L = ['apple','red','apple','red','red','pear']
>>> from collections import defaultdict
>>> d = defaultdict(int)
>>> for i in L:
... d[i] += 1
>>> d
defaultdict(<type 'int'>, {'pear': 1, 'apple': 2, 'red': 3})
解决方案 5:
我一直认为,对于如此简单的任务,我不会想导入任何东西。但我可能错了,这取决于 collections.Counter 是否更快。
items = "Whats the simpliest way to add the list items to a dictionary "
stats = {}
for i in items:
if i in stats:
stats[i] += 1
else:
stats[i] = 1
# bonus
for i in sorted(stats, key=stats.get):
print("%d×'%s'" % (stats[i], i))
我认为这可能比使用 count() 更好,因为它只会遍历可迭代对象一次,而 count 可能会在每次迭代中搜索整个对象。我使用此方法解析了几兆字节的统计数据,而且它总是相当快。
解决方案 6:
L = ['apple','red','apple','red','red','pear']
d = {}
[d.__setitem__(item,1+d.get(item,0)) for item in L]
print d
给予{'pear': 1, 'apple': 2, 'red': 3}
解决方案 7:
如果你使用 Numpy,该unique
函数可以通过传递以下内容告诉你每个值出现的次数return_counts=True
:
>>> data = ['apple', 'red', 'apple', 'red', 'red', 'pear']
>>> np.unique(data, return_counts=True)
(array(['apple', 'pear', 'red'], dtype='<U5'), array([2, 1, 3]))
计数的顺序与找到的不同元素的顺序相同;因此我们可以使用通常的技巧来创建所需的字典(将两个元素作为单独的参数传递给zip
):
>>> dict(zip(*np.unique(data, return_counts=True)))
{'apple': 2, 'pear': 1, 'red': 3}
如果你特别有一个由小整数组成的大型输入 Numpy 数组,则可能会从以下方式获得更好的性能bincount
:
>>> data = np.random.randint(10, size=100)
>>> data
array([1, 0, 0, 3, 3, 4, 2, 4, 4, 0, 4, 8, 7, 4, 4, 8, 7, 0, 0, 2, 4, 2,
0, 9, 0, 2, 7, 0, 7, 7, 5, 6, 6, 8, 4, 2, 7, 6, 0, 3, 6, 3, 0, 4,
8, 8, 9, 5, 2, 2, 5, 1, 1, 1, 9, 9, 5, 0, 1, 1, 9, 5, 4, 9, 5, 2,
7, 3, 9, 0, 1, 4, 9, 1, 1, 5, 4, 7, 5, 0, 3, 5, 1, 9, 4, 8, 8, 9,
7, 7, 7, 5, 6, 3, 2, 4, 3, 9, 6, 0])
>>> np.bincount(data)
array([14, 10, 9, 8, 14, 10, 6, 11, 7, 11])
输出数组中的第 th 个值n
表示出现的次数n
,因此我们可以根据需要使用以下命令创建字典enumerate
:
>>> dict(enumerate(np.bincount(data)))
{0: 14, 1: 10, 2: 9, 3: 8, 4: 14, 5: 10, 6: 6, 7: 11, 8: 7, 9: 11}
解决方案 8:
这是一个简单的答案!
def equalizeArray(arr):
# Counting the frequency of each element in the array
freq = {}
for i in arr:
if i not in freq:
freq[i] = 1
else:
freq[i] += 1
# Finding the element with the highest frequency
max_freq = max(freq.values())
# Calculating the number of deletions required
for key,value in freq.items():
if value == max_freq:
print(key,"been repeated:",value,"times")
解决方案 9:
首先创建要计数的元素列表
elements = [1, 2, 3, 2, 1, 3, 2, 1, 1, 4, 5, 4, 4]
创建一个空字典,我们对列表也做同样的事情
>>> counts = {}
创建一个 for 循环,计算“key”出现的次数,每次出现时加 1
for element in elements:
if element in counts:
counts[element] +=1
检查我们之前是否遇到过该键,如果是,我们就加 1,如果没有,我们就使用“else”,这样新的键就被添加到字典中。
>>> else:
>>> counts[element] = 1
现在使用 'items() 打印计数,以便我们可以创建键值对的序列
for element, count in counts.items():
print(element, ":", count)
在这里,items() 方法向我们展示了键值对,就好像我们问:“对于元素,也就是在元素中将先前的数据加载到'count'中,并将其更新为键值对序列,这就是 item() 所做的
无注释的代码:
elements = [1, 2, 3, 2, 1, 3, 2, 1, 1, 4, 5, 4, 4]
counts = {}
for element in elements:
if element in counts:
counts[element] += 1
else:
counts[element] = 1
for element, count in counts.items():
print(element, ":", count)
OUTPUT:
1:4
2:3
3:2
4:3
5:1
解决方案 10:
mylist = [1,2,1,5,1,1,6,'a','a','b']
result = {}
for i in mylist:
result[i] = mylist.count(i)
print(result)
- 2025年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 项目管理必备:盘点2024年13款好用的项目管理软件
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)