Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 翻字典?_Python_Python 3.x_Dictionary_Invert - Fatal编程技术网

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()}