基于exist函数的Python反向字典



我正在尝试反向字典。我有一本名为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。

最新更新