“替代方案”;分配给函数调用";在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))]
类似的问题(但没有帮助我):一般来说,您可以做三件事:
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