“替代方案”;分配给函数调用";在python中

“替代方案”;分配给函数调用";在python中,python,list,assign,Python,List,Assign,我正在尝试解决这个新手难题: 我创建了这个函数: def bucket_loop(htable, key): bucket = hashtable_get_bucket(htable, key) for entry in bucket: if entry[0] == key: return entry[1] return None 我必须以以下方式在另外两个函数

我正在尝试解决这个新手难题:

我创建了这个函数:

def bucket_loop(htable, key):
    bucket = hashtable_get_bucket(htable, key)
    for entry in bucket:
        if entry[0] == key:          
            return entry[1]                         
    return None
我必须以以下方式在另外两个函数(下面)中调用它:更改元素条目[1]的值,或者向这个列表(条目)追加一个新元素。但是我不能像我那样调用函数bucket\u循环,因为“您不能分配给函数调用”(分配给函数调用在Python中是非法的)。做这个(bucket_loop(htable,key)=value和hashtable_get_bucket(htable,key).append([key,value]))的替代方法是什么(最类似于我写的代码)

提前感谢您的帮助

以下是使此脚本正常工作的其余代码:

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))]

类似的问题(但没有帮助我):

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

  • 编写“setter”函数(例如,
    bucket\u set
  • 返回可变值(例如,
    bucket\u get(表,键)。如果值是
    列表,则追加(42)
  • 使用一个重写
    \uuuuu getitem\uuuuuuuuuuuuu
    \uuuuuuuuu setitem\uuuuuuuuuu
  • 例如,您可以有一个类,如:

    class Bucket(object):
        def __setitem__(self, key, value):
            # … implementation …
        def __getitem__(self, key):
            # … implementation …
            return value
    
    然后像这样使用它:

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

    这将是最具python风格的方法。

    一个需要很少更改的选项是在
    bucket\u循环中添加第三个参数,可选,用于赋值:

    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
    
    但是,有几点需要注意:

  • 我同意Ignacio Vazquez Abrams和David Wolever的观点,上课会更好

  • 由于一个bucket可以有多个键/值对,如果第一个条目与您的键不匹配,则不应返回None。循环遍历所有它们,最后只返回一个;(您也可以编辑此语句,默认行为是返回None)

  • 如果您的htable不允许
    None
    作为值,您可以使用它而不是
    empty


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

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

    真正的指示:

    修改hashtable_update和hashtable_lookup的代码,使其具有与现在相同的行为,但在每个过程中使用更少的代码行。您应该定义一个新的过程helper来帮助实现这一点。新版本的运行时间应该与原始版本大致相同,但两者都没有 hashtable_update或hashtable_lookup应包括任何for或while循环,每个过程的代码块不应超过6行


    说真的,作弊是很蹩脚的。

    你有没有考虑过把它变成一个类,并定义
    \uuu getitem\uuuuuuuuuuuuuu()
    \uuuuuuuuu setitem\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu()
    ?我对你的。您有一个带有if-else语句的循环,因此它只执行一个循环。您是只想检查bucket中的第一个元素还是要检查bucket中的所有元素?嗨,Ignacio Vazquez Abrams,我不想在这个过程中使用类(我还没有学会这个概念)。但非常感谢你的提示。嗨,@Jeff,我想检查一下桶里的所有元素,直到找到一个满足条件的元素。谢谢你的关注!谢谢你,大卫,祝你生日快乐!我仍然怀疑如何更改列表的值(在本例中,条目[1]是一个列表),例如“bucket_循环(htable,key)=value”,但您的建议帮助了我。现在它不再返回bucket_循环(htable,key)返回条目[1],而是返回条目(它也是一个列表),我在hashtable_update(htable,key,value)中以这种方式为条目分配了一个新值:“条目[1]=value”。但是如果有一种方法可以返回这个条目[1](而不是条目),那就更好了)。如果
    bucket\u lookup
    返回一个列表(你也可以,比如说,
    bucket\u lookup(htable,key)。name=“John”
    如果
    bucket\u lookup
    返回了一个
    人,你可以使用
    bucket\u lookup(htable,key)[0]=42
    )。这是因为,在这种情况下,您将分配给
    bucket\u lookup
    返回的对象的字段,而不是直接分配给该对象。您能为这一指控提供证据吗?
    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