我正在尝试反转字典。我有一个名为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.
"""
我提前感谢您的帮助!
答案 0 :(得分:0)
看起来您正在将person_to_network()
函数对象作为参数传递给invert_networks_dict()
函数。然后,您将函数的本地范围内的person_to_network
变量视为dictionary
对象和可调用function
对象。
因此,您提出的对象不是可订阅的异常,因为函数在Python中不可订阅(例如,它们不像字典那样支持__getitem__()
方法)。更多关于可订阅的含义here
所以我希望你要做的是将调用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
有关命名空间和范围规则here的更多信息。
答案 1 :(得分:0)
您的第一个错误是您也使用person_to_networks函数作为字典名称。你应该给它一个不同的名字。目前,当它被用作参数时,python会发现它已被定义为函数并尝试使用它。我已将下面的名称从person_to_networks(这是函数的名称)更改为person_dict,以显示需要为此执行的操作。在这种情况下,您将分别调用这两个函数并将结果字典传递给反转函数。如果你只想调用反转函数,传入指向person_to_networks()函数的指针并调用它来设置字典值,然后使用字典值。
请注意,你拥有它的方式使人成为字典,而不是该字典中的密钥。
请注意我在下方放置**指示符的行。这将重置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]而非人。