5

私はパイソンで働いています。ディクショナリ内の値が複数のキーで見つかった回数をカウントし、カウントを返す方法はありますか?

たとえば、50 個の値があり、これを行うスクリプトを実行すると、次のようなカウントが得られます。

1: 23  
2: 15  
3: 7  
4: 5  

上記は、1 つのキーに 23 の値が表示され、2 つのキーに 15 の値が表示され、3 つのキーに 7 つの値が表示され、4 つのキーに 5 つの値が表示されることを示しています。

また、辞書にキーごとに複数の値がある場合、この質問は変わりますか?

これが私の辞書のサンプルです(それは細菌の名前です):

{'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

したがって、4 つの細菌名は 1 つのキーにのみ含まれ、3 つの細菌は 2 つのキーに含まれ、1 つの細菌は 3 つのキーに含まれます。

4

3 に答える 3

6

したがって、私がこれを間違って読んでいない限り、あなたが知りたいのは次のとおりです。

  • 元のディクショナリの各値について、それぞれ異なる値のカウントが何回発生しますか?
  • 本質的に、辞書内の値の頻度が必要です

私は他の答えよりもエレガントではないアプローチを取りましたが、問題を個々のステップに分解しました:

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]

このコードは codepad でテストすることもできます。

于 2013-09-03T01:01:18.643 に答える