我正在尝试反向字典。我有一本名为person_to_networks的字典。这个函数可以正常工作,但是逆函数给出了一个错误。它是'function' object is not subscriptable
。文本文件包含个人姓名,网络和朋友的姓名。这里是文本
def person_to_networks(profiles_file):
"""
(file open for reading) -> dic of {str: list of str}
"""
# initialize data to be processed
这是一个逆函数:
def invert_networks_dict(person_to_networks):
"""
(dict of {str: list of str}) -> dict of {str: list of str}
Return a "network to people" dictionary based on the given
"person to networks" dictionary.
"""
我提前感谢你的帮助! 看起来您正在将person_to_network()
函数对象作为参数传递给invert_networks_dict()
函数。然后,将函数局部作用域中的person_to_network
变量视为dictionary
对象和可调用的function
对象。
结果你将引发一个object not subscriptable异常,因为函数在Python中是不可下标的(例如,它们不像字典那样支持__getitem__()
方法)。更多关于可下标的含义
所以我希望你想做的是将调用person_to_network()函数返回的字典赋值给一个新变量。
def invert_networks_dict(person_to_networks):
"""
(dict of {str: list of str}) -> dict of {str: list of str}
Return a "network to people" dictionary based on the given
'person to networks' dictionary.
"""
networks_to_person = {}
person_to_network_dict = person_to_networks(profiles_file)
for person in person_to_network_dict:
networks = person_to_networks_dict[person]
# etc
注意,您不需要将person_to_networks()
函数对象传递给invert_networks_dict()
函数。如果Python在局部函数作用域中没有找到匹配的变量,它会查找所有封闭函数,然后在全局作用域中查找匹配的变量。
>>> def foo():
print "foo"
>>> def bar():
foo()
>>> bar()
foo
关于名称空间和作用域规则的更多信息请参阅此处。
您的第一个错误是您还使用了函数person_to_networks作为字典名称。你应该给它起个不同的名字。目前,当它被用作参数时,python认为它已经被定义为一个函数,并尝试这样使用它。我已经将下面的名称从person_to_networks(这是函数的名称)更改为person_dict,以显示需要为此做些什么。在这种情况下,您将分别调用这两个函数,并将结果字典传递给反函数。如果你只想调用反转函数,将指针传递给person_to_networks()函数并调用它来设置字典值,然后使用字典值。
请注意,您的方式使person成为字典,而不是该字典中的键。
注意我在下面放了**指示器的那一行。这将重置networks_to_person[networks]值,以便清除之前的值。然后if会将相同的值追加到字典中。此外,您应该将初始值设置为[person],以便可以添加未来的值。此外,您可能还需要检查您是否已经将人员置于该网络值中。
def invert_networks_dict(person_to_networks):
"""
(dict of {str: list of str}) -> dict of {str: list of str}
Return a "network to people" dictionary based on the given
"person to networks" dictionary.
"""
networks_to_person = {}
person_dict = person_to_networks(profiles_file)
for person in person_dict:
networks = person_dict[person] # networks is a list of values under the person key
# **networks_to_person[networks] = person** # This should not be here
for network in networks: # Now put the person under each network in networks list
if network not in networks_to_person: #Now use each network as a key
networks_to_person[network] = [person]
else:
networks_to_person[network].append(person) # Note that append needs ()
这意味着每个键值都将是值[person, person],假设您已将第一个值固定为[person]而不是person。