Python 翻字典?
我收到以下错误消息:Python 翻字典?,python,python-3.x,dictionary,invert,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 per
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\u分配给\u person
一个列表。但是,您希望它是一个命令:
networks_to_person = dict() # <--
您想在这里调用append
,而不是索引它。因此,您需要:
networks_to_person[networks].append(person)
最后,请注意,不能将列表作为字典的键。如果要“反转”字典
d
(交换键和值),可以使用tuple()
将它们转换为元组(可以是键),而不是使用tuple(),值是字符串列表,您可以:
dict((tuple(val), key) for key, val in d.items())
但是,只有当d.values
是唯一的时,才能执行此操作,因为新字典中的键必须是唯一的
说明:
dict()
是一个内置程序,它根据成对序列(键、值)
创建字典。和所有字典一样,密钥必须是可散列的
因为我们想使d
的值成为新的键,所以我们需要将它们转换为可散列的值——在本例中,这将是tuple。我们可以从任何序列创建它,包括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作为项的功能吗
因此,与此相反:
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()}
下一个错误将出现在networks\u to\u person[networks]。追加[person]
。这里需要一个函数调用:networks\u to\u person[networks]。append(person)
。请注意()
而不是[]
。更改后,返回的是TypeError:unhabable type:'list'@user3450897,请参阅glglgl的注释。哦,对了!我仍然得到TypeError:不可损坏的类型:“list”。还有什么不对劲吗?谢谢你,这太有帮助了!tuple()部分从何而来?dict是表示一般字典还是反向字典?dict是一个内置构造函数,它创建字典。您可以将其分配给某些内容,例如result=dict((tuple(val),key)代表key,val位于d.items()中)
我马上添加更多解释谢谢!我使用networks\u to_person=dict((v,k)表示k in person\u to_networks表示v in\person\u to_networks[k])返回networks\u to_person但是,如果有多个值,那么只有第一个值成为键,我如何修复它?您不能只是“修复”它。如果希望有多个值,则需要存储在字典列表中,如{'my_key':[1,2,3,4]}
。如果这是您想要的,那么您应该看看collections.defaultdict,但这是另一个问题。如果你喜欢这个答案,请接受它。
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()}