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

我必须以下列方式在其他两个函数(如下)中调用它:更改元素 entry[1] 的值或将新元素附加到此列表(条目)。但是我不能像我那样调用函数 bucket_loop 因为“你不能分配给函数调用”(在 Python 中分配给函数调用是非法的)。执行此操作的替代方法(与我编写的代码最相似)是什么(bucket_loop(htable, key) = value 和 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: "can't assign to function call"

4

3 回答 3

2

一般来说,你可以做三件事:

  1. 编写“setter”函数(例如,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

一个需要很少更改的选项是添加第三个参数bucket_loop,可选,用于赋值:

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

所以你基本上是在 udacity 作弊,这是一个在线 CS 课程/大学?有趣的是你甚至不能正确地声明这个问题。下次彻底作弊并粘贴您应该简化的两个函数并请求某人通过创建第三个函数来简化它们,其中包含重叠代码。无论如何都没关系,因为如果这是您需要帮助的人,那么您可能在课堂上表现不佳

您也能够在不使用大多数这些工具的情况下解决问题,这是一个了解如何识别句柄冗余的练习,而不是效率......

真实说明:

修改 hashtable_update 和 hashtable_lookup 的代码,使其具有与现在相同的行为,但在每个过程中使用更少的代码行。您应该定义一个新过程 helper 来帮助解决这个问题。你的新版本的运行时间应该和原版本差不多,但是 hashtable_update 和 hashtable_lookup 都不应该包含任何 for 或 while 循环,并且每个过程的块应该不超过 6 行代码

说真的,作弊是蹩脚的。

于 2012-03-26T15:36:11.813 回答