将字典分成两个列表,一个是键的列表,另一个是值的列表?

26

我使用 pickle.load 从文件中读取了一个类型为 collections.defaultdict 的对象。它为每个字符串键提供了一个数字值。它看起来就像是一个 dict 对象,但我可能错了。

我想从这个对象中创建两个列表,一个列表包含所有键,另一个列表包含所有值。我应该如何在 dict 对象上完成这个操作?我应该如何在 collections.defaultdict 对象上完成这个操作?

例如,从一个 dict 对象开始:

tel = {'jack': 4098, 'sape': 4139}

我想创建两个列表 ['jack', 'sape'][4098, 4139]

谢谢!!


1
同样的顺序或两个列表的顺序无关紧要。 - Trent
5个回答

34

您可以在Python 2.x中使用:

keys = tel.keys()
values = tel.values()

或者像一些奇特的东西:

(keys,values) = zip(*tel.iteritems())

在 Python 3.x 中:

keys = list(tel.keys())
values = list(tel.values())
(keys,values) = zip(*tel.items())

(就像在3.x中,keys()、values()和items()返回迭代器一样)


为什么不只是使用list(tel.iterkeys())呢?+1,尽管如此我不知道他们在Python 3中去掉了另一个函数。 - Joran Beasley
是的,说得好。尽管list(tel.iterkeys())变成了tel.keys()。 - isedev
这就是我想做的,但是我对字典中的keys()和values()等没有保证顺序感到有些担心。不过我猜它们一定会正确匹配吧?假设在调用之间字典没有被修改?我猜使用.items()的那个特别安全。 - Ben Farmer

14

使用一步操作(Python 2.x):

keys, values = zip(*tel.iteritems())

或者在Python 3.x中:

keys, values = zip(*tel.items())

4
keys = my_dict.keys()
vals = my_dict.values()
keys,values = zip(*my_dict.items())

哦,我不知道在Python 3中它已经消失了。 - Joran Beasley
抱歉,有点累了... 在2.x中的iterkeys()等同于在3.x中的keys()。 - isedev

3
k = tel.keys() # a list of the dict keys
v = tel.values() # a list of the dict values

或者

k, v = [], []
for key, value in tel.items():
    k.append(key)
    v.append(value)  

0
key = []
value = []
for i,j in tel.iteritems():
    key.append(i)
    value.append(j)


 key
['sape', 'jack']
value
[4139, 4098]

这个 iteritems 应该能解决问题 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接