0

几周前我开始学习 Python(之前没有任何关于它的知识,也没有编程知识)。我想创建一个定义,它将给定字典作为参数返回一个由两个列表组成的元组 - 一个只有字典的键,另一个只有给定字典的值。基本上,代码将如下所示:

"""Iterate over the dictionary named letters, and populate the two lists so that 
keys contains all the keys of the dictionary, and values contains 
all the corresponding values of the dictionary. Return this as a tuple in the end."""

def run(dict):
    keys = []
    values = []
    for key in dict.keys():
        keys.append(key)
    for value in dict.values():
        values.append(value)
    return (keys, values)


print run({"a": 1, "b": 2, "c": 3, "d": 4})

这段代码运行良好(虽然这不是我的解决方案)。但是如果我不想使用.keys().values()方法怎么办?在那种情况下,我尝试使用类似这样的东西,但我收到“不可散列的类型:'list'”错误消息:

def run(dict):
    keys = []
    values = []
    for key in dict:
        keys.append(key)
        values.append(dict[keys])
    return (keys, values)


print run({"a": 1, "b": 2, "c": 3, "d": 4})

似乎是什么问题?

4

3 回答 3

6

您正在尝试将整个keys列表用作键:

values.append(dict[keys])

也许您打算dict[key]改用?Alist是可变类型,不能用作字典中的键(它可以就地更改,使键不再可在字典的内部哈希表中定位)。

或者,循环遍历.items()序列:

for key, value in dct.items():
    keys.append(key)
    values.append(value)

请不要dict用作变量名;你这样做是在隐藏内置类型。

于 2013-05-28T23:59:38.363 回答
4

编写函数的另一种更简单(错误机会更少)的方法

def run(my_dict):
    return zip(*my_dict.items())
于 2013-05-29T00:20:24.450 回答
2

Martijn 的回答是正确的,但也请注意,您的原始样本所做的工作比它需要的要多。dict.keys() 和 dict.values() 都返回列表,没有理由重新创建它们。代码可以是:

def run(my_dict):
    return my_dict.keys(), my_dict.values()

print run({"a": 1, "b": 2, "c": 3, "d": 4})
于 2013-05-29T00:12:37.327 回答