将字典转换为列表?

295

我试图将一个Python字典转换成一个Python列表,以便进行一些计算。

#My dictionary
dict = {}
dict['Capital']="London"
dict['Food']="Fish&Chips"
dict['2012']="Olympics"

#lists
temp = []
dictList = []

#My attempt:
for key, value in dict.iteritems():
    aKey = key
    aValue = value
    temp.append(aKey)
    temp.append(aValue)
    dictList.append(temp) 
    aKey = ""
    aValue = ""

这是我的尝试……但我无法弄清楚哪里出了问题?


7
sum(dict.items(), ()) - Natim
28
请注意,在Python 3中,dict.items()dict.keys()dict.values()返回的是一个字典对象(Dictionary object),该对象不支持索引,因此不是真正的列表。可以通过list(dict.values())获得一个真正的列表。 - ZhaoGang
7个回答

554
dict.items()

这行代码就可以了。

(仅适用于Python 2)


25
我知道肯定有一些荒谬的 Python 语言方法可以实现这个,非常感谢。我只是觉得 Python 的文档阅读起来有点困难! - Federer
40
他想要一个平的列表,而items()方法生成的是一个元组列表。 - Ajith Antony
55
使用 dict.values() 方法可以得到一个扁平化的列表。 - Andy Fraley
5
当我试图访问由 dictlist=dict.items() 生成的列表时,尝试使用 dictlist[i][1] 访问时出现了错误。Python3 文档说:~~~ "dict.keys()、dict.values() 和 dict.items() 返回的对象是视图对象。它们提供了字典条目的动态视图,这意味着当字典发生变化时,视图将反映这些变化。" ~~~~ 还需要一步才能使它正常工作: ---- [ (item[0],item[1]) for item in dict.items() ] - Craig Hicks
53
Python3 使用 list(dict.values()) - Demetris
显示剩余4条评论

274

在Python中,将dict转换为列表非常简单。以下是三个示例:

>> d = {'a': 'Arthur', 'b': 'Belling'}

>> d.items()
[('a', 'Arthur'), ('b', 'Belling')]

>> d.keys()
['a', 'b']

>> d.values()
['Arthur', 'Belling']

能否指定 values() 的顺序?标准字典的值的顺序是否已定义? - Michael Scheper
2
@MichaelScheper 标准字典的顺序未指定,值的顺序可能与插入顺序不同。但是,可以对上述列表进行排序或使用OrderedDict(请参见第一个链接)。 - Akseli Palén
20
在Python3中,似乎必须使用list(d.items())、list(d.keys())和list(d.values())。 - MACE
1
每一行列表开头都似乎是dict_values。 - user3520245
@MichaelScheper 字典没有稳定的排序,如果您想要按键排序,请使用“[v for k, v in sorted(d.items(), key=lambda pair: pair[0])]”这个方法。很遗憾Python无法在lambda表达式中对元组进行解包。 - Facundo
在Python3中,dict.items()dict.keys()dict.values()实际上返回的是字典视图而不是列表。字典视图会随着字典本身动态改变,并且比较运算符可能会产生意外的行为。如果您想要一个列表,请按照@MACE的建议操作。 - Márton Kardos

184

你的问题在于你把keyvalue放在引号中,使它们成为字符串。也就是说,你正在将aKey设置为包含字符串"key"而不是变量key的值。此外,你没有清空temp列表,因此每次都会向其中添加内容,而不仅仅是两个元素。

要修复你的代码,请尝试以下方法:

for key, value in dict.iteritems():
    temp = [key,value]
    dictlist.append(temp)
不需要在使用之前将循环变量 keyvalue 复制到另一个变量中,因此我将它们省略了。同样,您不需要使用 append 方法来构建列表,可以像上面显示的那样在方括号中指定即可。如果我们想尽可能简洁,我们可以使用 dictlist.append([key,value])。或者只需使用已经建议过的 dict.items() 方法。

3
由于解释了我做错了什么,所以这是正确的答案。你可以看出来,我对 Python 还比较新,任何解释都会受到欢迎。谢谢! - Federer
2
如果你像这样使用append列表,你会得到一个列表的列表。他想要的是一个平坦的列表,你需要使用extend()就像Shay的回答中那样。 - Ajith Antony
2
他从未说过那样的话,Ajith。一个列表的列表是一个有效的Python列表,并且比仅包含非列表值的平面列表更好地解释了“字典”的概念。一个列表的列表至少能够将键和值仍然分组显示在一起。 - codetaku
9
它说'dict' object has no attribute 'iteritems'。请问能否更新适用于Python 3.6的答案? - Trect
4
dict(iterable) -> new 创建一个新的字典,初始化方式为: d = {} for k, v in iterable: d[k] = v,请使用 items() 替代 'iteritems' - Anu
嗨,正如@Trect所说,这是一个错误,为了避免这种情况,请使用dict.items(),像这样就可以了:dictlist=[] for key, value in dictionary.items(): temp = [key,value] dictlist.append(temp) print(dictlist) - bilalmohib

78
你应该使用dict.items()。 以下是解决你问题的一行代码:
[(k,v) for k,v in dict.items()]

并且结果是:

[('Food', 'Fish&Chips'), ('2012', 'Olympics'), ('Capital', 'London')]

或者你可以这样做

l=[]
[l.extend([k,v]) for k,v in dict.items()]

for:

['Food', 'Fish&Chips', '2012', 'Olympics', 'Capital', 'London']

2
在Python 2.6中,至少不需要使用dict.items():[(k,v) for k,v in dict] - hughdbrown
3
Python3.6 - [x for x in dict.items()] 的作用与之相同。 - SIGSTACKFAULT
6
或者只需使用 list(dict.items()) - ajb

46
 >>> a = {'foo': 'bar', 'baz': 'quux', 'hello': 'world'}
 >>> list(reduce(lambda x, y: x + y, a.items()))
 ['foo', 'bar', 'baz', 'quux', 'hello', 'world']

解释一下:a.items() 返回一个元组列表。将两个元组相加会得到一个包含所有元素的元组。因此,这个规约操作会创建一个包含所有键和值的元组,然后 list(...) 会从中创建一个列表。


有趣...这种合并方式可能在某些地方会有用处。 - Akseli Palén
8
Python 3.^ 中,不要使用 reduce 函数,而应该使用 functools 模块下的 reduce 函数。 - alexandre9865

29

可能您只是想要这个:

dictList = dict.items()

你的方法有两个问题。其一是你用引号括起来的 keyvalue,它们是字符串,包含字母“key”和“value”,而不是与这些名称相关的变量。此外,你一直向“temporary”列表添加元素,并且从之前的迭代中永远无法清除已经存在于其中的旧元素。确保在每次迭代中都有一个新的并且为空的 temp 列表,并使用 keyvalue 变量:

for key, value in dict.iteritems():
    temp = []
    aKey = key
    aValue = value
    temp.append(aKey)
    temp.append(aValue)
    dictList.append(temp)

注意,这个可以不使用临时变量来写(在Python 3中可以用items()代替iteritems()):

for key, value in dict.items():
    dictList.append([key, value])

5

如果您只是创建一个元组列表的字典,因为像您创建的那样创建字典可能很麻烦,那么您可以考虑使用zip()函数。

如果您有一个标题和多行数据,则使用zip()函数尤其有用。例如,如果我假设您想要获取每个国家的奥运会统计信息:

headers = ['Capital', 'Food', 'Year']
countries = [
    ['London', 'Fish & Chips', '2012'],
    ['Beijing', 'Noodles', '2008'],
]

for olympics in countries:
    print zip(headers, olympics)

提供

[('Capital', 'London'), ('Food', 'Fish & Chips'), ('Year', '2012')]
[('Capital', 'Beijing'), ('Food', 'Noodles'), ('Year', '2008')]

不知道这是否是最终目标,可能有些离题,但这是需要记在心里的事情。


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