基于存在函数的python反向字典

时间:2014-03-30 22:52:58

标签: python dictionary reverse

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

    """

我提前感谢您的帮助!

2 个答案:

答案 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]而非人。