【问题标题】:Inverting a dictionary?反转字典?
【发布时间】:2014-03-22 22:17:31
【问题描述】:

我收到此错误消息:

TypeError: list indices must be integers, not list

使用此代码:

def invert_networks_dict(person_to_networks):
    """
    (dict of {str: list of str}) -> dict of {str: list of str})
    """

    networks_to_person = []

    for person in person_to_networks:
        networks = person_to_networks[person]
        networks_to_person[networks] = person

        if not (networks in networks_to_person):
            networks_to_person[networks] = person
        else:
            networks_to_person[networks].append[person]

我该如何解决?

【问题讨论】:

  • 下一个错误将出现在networks_to_person[networks].append[person]。这是需要的函数调用:networks_to_person[networks].append(person)。注意() 而不是[]

标签: python python-3.x dictionary


【解决方案1】:

您应该已经将networks_to_person 初始化为字典:

networks_to_person = {}

【讨论】:

  • 随着该更改返回 TypeError: unhashable type: 'list'
  • @user3450897,见 glglgl 的评论。
【解决方案2】:
networks_to_person = []

这会将networks_to_person 分配给一个列表。但是,您希望它是一个字典:

networks_to_person = dict()  # <--

您也可以使用{}(空字典文字),但我更喜欢dict(),因为它使您的意图更加明确。


@glglgl 在 cmets 中提出了一个很好的观点(为了完整起见,我将在此重申)。

networks_to_person[networks].append[person]

你想调用append这里,而不是索引它。因此,您希望:

networks_to_person[networks].append(person)

最后,请注意,您不能将列表作为字典的键。您可以将它们转换为元组(可以是键),而不是使用 tuple()

【讨论】:

  • 谢谢,这非常有帮助! tuple() 部分是从哪里来的?
【解决方案3】:

如果你想“反转”字典 d(交换键和值),值是字符串列表,你可以:

dict((tuple(val), key) for key, val in d.items())

但是,您只能在 d.values 唯一的情况下执行此操作,因为新字典中的键必须是唯一的。

说明: dict() 是一个内置函数,可以从 (key, value) 的对序列中创建字典。与每个字典一样,键必须是可散列的。

因为我们想要创建 d 新键的值,我们需要将它们转换为可散列的东西——在这种情况下,这将是元组。我们可以从任何序列创建它,包括值为d 的列表,以及另一个内置函数:tuple()

所以我们需要的是来自d 的值中的键对。我们可以使用d.items() 获取它们。我们可以使用列表推导轻松地做到这一点,另外将 val 包装在元组中,使其可散列,因此可以用作键:

[(tuple(val), key) for key, val in d.items())] # that would create list of pairs

但是如果我们将一些东西传递给函数,我们不需要创建列表,我们可以传递类似于生成器理解的表达式,所以我们的最终代码如下所示:

result = dict((tuple(val), key) for key, val in d.items())

【讨论】:

  • dict代表通用字典还是倒排字典?
  • dict 是一个内置的构造函数,用于创建字典。您可以将其分配给某些东西,例如 result = dict((tuple(val), key) for key, val in d.items())
  • 我稍后再补充说明
  • 谢谢!我使用 networks_to_person = dict((v,k) for k in person_to_networks for v in \ person_to_networks[k]) return networks_to_person 但是,如果有多个值,那么只有第一个值成为键,我该如何解决这个问题?
  • 你不能只是“修复”它。如果您希望有多个值,则需要存储在字典列表中,例如{ 'my_key' : [1, 2,3 ,4]}。如果这是您想要的,您应该查看collections.defaultdict,但这是另一个问题。 PS。如果你喜欢这个答案,请采纳。
【解决方案4】:

你知道字典是items function

所以不是这样:

networks_to_person = {}

for person in person_to_networks:
    networks = person_to_networks[person]
    networks_to_person[networks] = person

你可以的

networks_to_person = {}

for person, networks in person_to_networks.items():
    networks_to_person[networks] = person

也可以写成:

networks_to_person = {networks: person for person, networks in person_to_networks.items()}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 2021-08-21
    相关资源
    最近更新 更多