我收到此错误消息:
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]
我该如何解决?
答案 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()}