我在python工作.有没有办法计算在多个键中找到字典中的值的次数,然后返回计数?
因此,如果我有50个值并且我运行了一个脚本来执行此操作,我会得到一个看起来像这样的计数:
1: 23
2: 15
3: 7
4: 5
Run Code Online (Sandbox Code Playgroud)
以上将告诉我23个值出现在1个键中,15个值出现在2个键中,7个值出现在3个键中,5个值出现在4个键中.
此外,如果我的字典中每个键有多个值,这个问题会改变吗?
这是我的字典样本(它的细菌名称):
{'0': ['Pyrobaculum'], '1': ['Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium'], '3': ['Thermoanaerobacter', 'Thermoanaerobacter'], '2': ['Helicobacter', 'Mycobacterium'], '5': ['Thermoanaerobacter', 'Thermoanaerobacter'], '4': ['Helicobacter'], '7': ['Syntrophomonas'], '6': ['Gelria'], '9': ['Campylobacter', 'Campylobacter'], '8': ['Syntrophomonas'], '10': ['Desulfitobacterium', 'Mycobacterium']}
所以从这个样本中,有8个独特的值,我将得到理想的反馈:
1:4
2:3
3:1
Run Code Online (Sandbox Code Playgroud)
所以4个细菌名称仅在一个键中,3个细菌在两个键中找到,1个细菌在三个键中找到.
如果我理解正确,您需要计算字典值的计数.如果值是可数的collections.Counter,您只需要调用Counter字典值,然后再调用第一个计数器的值.下面是一个使用字典的示例,其中键是range(100),并且值在0到10之间是随机的:
from collections import Counter
d = dict(enumerate([str(random.randint(0, 10)) for _ in range(100)]))
counter = Counter(d.values())
counts_counter = Counter(counter.values())
Run Code Online (Sandbox Code Playgroud)
编辑:
将示例字典添加到问题后,您需要以稍微不同的方式进行第一次计数(d是问题中的字典):
from collections import Counter
c = Counter()
for v in d.itervalues():
c.update(set(v))
Counter(c.values())
Run Code Online (Sandbox Code Playgroud)
小智 5
因此,除非我读错了,否则你想知道:
我采取了一种不那么优雅的方法,而另一方则回答,但已将问题分解为各个步骤:
d = {'0': ['Pyrobaculum'], '1': ['Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium', 'Mycobacterium'], '3': ['Thermoanaerobacter', 'Thermoanaerobacter'], '2': ['Helicobacter', 'Mycobacterium'], '5': ['Thermoanaerobacter', 'Thermoanaerobacter'], '4': ['Helicobacter'], '7': ['Syntrophomonas'], '6': ['Gelria'], '9': ['Campylobacter', 'Campylobacter'], '8': ['Syntrophomonas'], '10': ['Desulfitobacterium', 'Mycobacterium']}
# Iterate through and find out how many times each key occurs
vals = {} # A dictonary to store how often each value occurs.
for i in d.values():
for j in set(i): # Convert to a set to remove duplicates
vals[j] = 1 + vals.get(j,0) # If we've seen this value iterate the count
# Otherwise we get the default of 0 and iterate it
print vals
# Iterate through each possible freqency and find how many values have that count.
counts = {} # A dictonary to store the final frequencies.
# We will iterate from 0 (which is a valid count) to the maximum count
for i in range(0,max(vals.values())+1):
# Find all values that have the current frequency, count them
#and add them to the frequency dictionary
counts[i] = len([x for x in vals.values() if x == i])
for key in sorted(counts.keys()):
if counts[key] > 0:
print key,":",counts[key]
Run Code Online (Sandbox Code Playgroud)
您还可以在键盘上测试此代码.