翻译字典?

时间:2014-03-22 22:17:31

标签: python python-3.x dictionary invert

我收到此错误消息:

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]

我该如何解决?

4 个答案:

答案 0 :(得分:1)

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

networks_to_person = {}

答案 1 :(得分:1)

networks_to_person = []

这会将networks_to_person分配给列表。但是,你希望它成为一个词典:

networks_to_person = dict()  # <--

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


@glglgl在评论中提出了一个很好的观点(我将在此重申完整性)。

networks_to_person[networks].append[person]

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

networks_to_person[networks].append(person)

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

答案 2 :(得分:0)

如果你想'反向'字典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())

答案 3 :(得分:0)

你知道dict是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()}