0

私はこの初心者のパズルを解こうとしています:

私はこの関数を作成しました:

def bucket_loop(htable, key):
    bucket = hashtable_get_bucket(htable, key)
    for entry in bucket:
        if entry[0] == key:          
            return entry[1]                         
    return None

そして、次の方法で他の2つの関数(以下)で呼び出す必要があります。要素entry [1]の値を変更するか、このリスト(entry)に新しい要素を追加します。しかし、 「関数呼び出しに割り当てることはできません」(Pythonでは関数呼び出しへの割り当ては違法である)ため、関数bucket_loopの呼び出しを私が行ったように行うことはできません。これを行うための代替手段(私が書いたコードに最も似ています)は何ですか(bucket_loop(htable、key)= value and hashtable_get_bucket(htable、key).append([key、value]))?

def hashtable_update(htable, key, value):
    if bucket_loop(htable, key) != None:
        bucket_loop(htable, key) = value
    else:
        hashtable_get_bucket(htable, key).append([key, value])

def hashtable_lookup(htable, key):
    return bucket_loop(htable, key)

よろしくお願いします。

これは、このスクリプトを機能させるための残りのコードです。

def make_hashtable(size):
    table = []
    for unused in range(0, size):
        table.append([])
    return table

def hash_string(s, size):
    h = 0
    for c in s:
         h = h + ord(c)
    return h % size

def hashtable_get_bucket(htable, key):
    return htable[hash_string(key, len(htable))]

同様の質問(しかし私を助けませんでした):SyntaxError:"関数呼び出しに割り当てることができません"

4

3 に答える 3

2

一般的に、次の 3 つのことを行うことができます。

  1. 「セッター」関数を書く (例: bucket_set)
  2. 可変値を返す (例:bucket_get(table, key).append(42)値が a の場合list)
  3. オーバーライドするクラスを使用し__getitem____setitem__

たとえば、次のようなクラスを作成できます。

class Bucket(object):
    def __setitem__(self, key, value):
        # … implementation …
    def __getitem__(self, key):
        # … implementation …
        return value

次に、次のように使用します。

>>> b = Bucket()
>>> b["foo"] = 42
>>> b["foo"]
42
>>> 

これは、最も Pythonic な方法です。

于 2012-03-26T05:26:29.520 に答える
1

変更をほとんど必要としないオプションの 1 つはbucket_loop、代入に使用するオプションの 3 番目の引数を に追加することです。

empty = object() # An object that's guaranteed not to be in your htable
def bucket_loop(htable, key, value=empty):
    bucket = hashtable_get_bucket(htable, key)
    for entry in bucket:
        if entry[0] == key:
           if value is not empty: # Reference (id) comparison
                entry[1] = value
            return entry[1]
        else: # I think this else is unnecessary/buggy
            return None

ただし、いくつかの指針:

  1. 私は Ignacio Vazquez-Abrams と David Wolever に同意します。

  2. バケットには複数のキーと値のペアを含めることができるため、最初のエントリがキーと一致しなかった場合に None を返すべきではありません。それらすべてをループし、最後に None のみを返します。(このステートメントも省略できます。デフォルトの動作では None が返されます)

  3. htable がNone値として認められない場合は、代わりにそれを使用できますempty

于 2012-03-26T05:38:09.673 に答える
-1

つまり、あなたは基本的に、オンライン CS クラス / 大学である udacity をごまかしていますか? 面白いのは、質問を適切に宣言することさえできなかったことです。次回は、単純化するはずの 2 つの関数を徹底的にチートして貼り付け、重複するコードを含む 3 つ目の関数を作成して単純化するよう誰かに依頼します。これがあなたが助けを必要とするものである場合、クラスでうまくやっていない可能性が高いので、とにかく問題ではありません

これらのツールのほとんどを使用せずに問題を解決することもできました。これは、効率ではなく、ハンドルの冗長性を特定する方法を理解するための演習でした...

実際の指示:

hashtable_update と hashtable_lookup の両方のコードを変更して、現在と同じ動作になるようにしますが、各プロシージャで使用するコードの行数を減らします。これを支援するために、新しいプロシージャー、ヘルパーを定義する必要があります。新しいバージョンの実行時間は元のバージョンとほぼ同じである必要がありますが、hashtable_update または hashtable_lookup のいずれにも for または while ループが含まれていてはならず、各プロシージャのブロックは 6 行以下のコードである必要があります。

真剣に、不正行為は不自由です。

于 2012-03-26T15:36:11.813 に答える