1

「</h1>

データ セット (tz フィールド) で最も頻繁に発生するタイム ゾーンに関心があるとします。これを行う方法はたくさんあります。まず、リスト内包表記を使用してタイムゾーンのリストを再度抽出しましょう。

In [26]: time_zones = [rec['tz'] for rec in records if 'tz' in rec]
In [27]: time_zones[:10]
Out[27]: [u'America/New_York', u'America/Denver', u'America/New_York', u'America/Sao_Paulo', u'America/New_York', u'America/New_York', u'Europe/Warsaw', u'', u'', u'']

ここで、タイムゾーンごとにカウントを生成するには:

def get_counts(sequence): 
   counts = {}
   for x in sequence: 
      if x in counts:
          counts[x] += 1 
      else:
          counts[x] = 1 
   return counts

」</h1>

これは教科書からの抜粋です。特定のタイムゾーンの出現回数を見つけるために使用されるループがよくわかりません。誰かが私のために直感的にそれを分解してもらえますか、私は初心者です。

フォローアップの質問:

「</h1>

上位 10 のタイム ゾーンとそのカウントが必要な場合は、ちょっとした辞書アクロバットを行う必要があります。

def top_counts(count_dict, n=10):
    value_key_pairs = [(count, tz) for tz, count in count_dict.items()]
    value_key_pairs.sort()
    return value_key_pairs[-n:]

」</h1>

引用は抜粋を示します。誰か関数 top_counts で何が起こっているのか説明してもらえますか?

4

6 に答える 6

8
def get_counts(sequence):  # Defines the function.
   counts = {}             # Creates an empty dictionary.
   for x in sequence:      # Loops through each item in sequence
      if x in counts:      # If item already exists in dictionary
          counts[x] += 1   # Add one to the current item in dictionary
      else:                # Otherwise...
          counts[x] = 1    # Add item to dictionary, give it a count of 1
   return counts           # Returns the resulting dictionary.
于 2013-09-25T20:44:33.317 に答える
1

ここでの主な操作は辞書検索です。

if x in counts:

タイムゾーンがカウントされているかどうかを確認します。カウント ディクショナリに存在する場合は、インクリメントされます。まだ存在しない場合は、新しいエントリを作成して 1 に設定します。

于 2013-09-25T20:42:42.047 に答える
0

この関数get_countsは次のことを行います。

リスト内のタイムゾーンごとに:

  1. タイムゾーンが既にディクショナリにあるかどうかを確認します ( if x in counts)。

  2. その場合、出現回数を 1 増やします ( counts[x] += 1)。

  3. そうでない場合は、カウントを 1 に初期化します ( counts[x] = 1)。

興味がある場合は、次のようにすることもできます。

from collections import Counter
ctr = Counter()
for x in sequence:
    ctr[x] += 1

不足しているアイテムの場合、Counter は自動的に 0 を返すため、初期化する必要はありません。

于 2013-09-25T20:52:36.730 に答える
0

Re: 補足質問です。

def top_counts(count_dict, n=10):
    value_key_pairs = [(count, tz) for tz, count in count_dict.items()] # Converts dictionary into a list of tuples, i.e. {'aaa': 1, 'bbb': 12, 'ccc': 4} into [(1, 'aaa'), (12, 'bbb'), (4, 'ccc')]
    value_key_pairs.sort() # Sorts the list. Default comparison function applied to tuples compares first elements first, and only if they are equal looks at second elements.
    return value_key_pairs[-n:] # Returns the slice of the sorted array that has last n elements.
于 2013-09-25T21:52:54.897 に答える
0

これは基本的に辞書 (またはハッシュ テーブル) を使用して、各タイム ゾーンが発生した回数を格納します。各合計countsは、タイム ゾーン文字列をキーとして に格納されます。これにより、既存のカウントをすばやく検索して、1 ずつ増やすことができます。

まず、 の各値をループしますsequence

for x in sequence:

反復ごとxに、現在の値に等しくなります。たとえば、最初の繰り返しでは、 America/New_Yorkxと等しくなります。

次に、この紛らわしい部分があります。

if x in counts:
   counts[x] += 1 
else:
   counts[x] = 1 

存在しないものをインクリメントすることはできないため、そのキーがマップに既に存在するかどうかを最初に確認する必要があります。以前にそのタイム ゾーンに遭遇したことがなければ、それはまだ存在していません。したがって、これまでに少なくとも1 回1発生したことがわかっているため、初期値を に設定する必要があります。

すでに存在する場合 (xの中にある場合counts)、そのキーを 1 つ増やすだけです。

counts[x] += 1 

これが今より理にかなっていることを願っています!

于 2013-09-25T20:45:28.407 に答える