如何将字典转换为元组列表?

260
如果我有一个字典,例如:
{'a': 1, 'b': 2, 'c': 3}

我该如何将它转换成这样?

[('a', 1), ('b', 2), ('c', 3)]

我该如何将它转换为这种格式?

[(1, 'a'), (2, 'b'), (3, 'c')]

11
[tuple(reversed(x)) for x in d.items()] - garej
2
@garej:鉴于在您的代码中x已经是一个元组(这是items产生元组可迭代对象的特性),更简单/更快的方法是直接使用[x[::-1] for x in d.items()];反转切片直接构造了一个逆序的正确大小的元组,而不是使用元组构造器从反向迭代器中迭代填充(最后进行过度分配和调整大小)一个元组。 - ShadowRanger
@ShadowRanger,你是对的。我只是想明确指出,在这种情况下,并不总是需要k, v模式。 - garej
13个回答

415
>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> list(d.items())
[('a', 1), ('c', 3), ('b', 2)]

从 Python 3.6 开始,列表的顺序是可以预期的。

在 Python 2 中,您不需要使用list


67

既然没有人做了,我来添加一下Python 3.x版本:

>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> list(d.items())
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v, k) for k, v in d.items()]
[(1, 'a'), (3, 'c'), (2, 'b')]

19

10

创建具有命名元组的列表

使用namedtuple通常非常方便。例如,您有一个以“名称”为键,“成绩”为值的字典:

d = {'John':5, 'Alex':10, 'Richard': 7}

你可以将项目列为元组,如果需要排序,然后使用非常Pythonic的方式获取最高分数(索引=0)的玩家的名称和得分:

>>> player = best[0]

>>> player.name
        'Alex'
>>> player.score
         10

如何实现以下功能:

将列表随机排序或按照 collections.OrderedDict 的顺序排序:

import collections
Player = collections.namedtuple('Player', 'name score')
players = list(Player(*item) for item in d.items())

按照值('score')排序,以升序排列:

import collections
Player = collections.namedtuple('Player', 'score name')

按最低分进行排序:

worst = sorted(Player(v,k) for (k,v) in d.items())

按最高分数排序:

best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)

7
[(k,v) for (k,v) in d.iteritems()]

并且

[(v,k) for (k,v) in d.iteritems()]

7
"[(k,v) for (k,v) in d.iteritems()]"这个表达式与d.items()相比是一个糟糕的等价替代。 - Devin Jeanpierre

7
您需要的是 dictitems()iteritems() 方法。 items 返回一个 (key, value) 元组列表。由于元组是不可变的,因此它们无法被反转。因此,您必须遍历这些元素并创建新的元组才能得到反转后的 (value, key) 元组。对于迭代,iteritems 更可取,因为它使用生成器来产生 (key, value) 元组,而不必在内存中保留整个列表。
Python 2.5.1 (r251:54863, Jan 13 2009, 10:26:13) 
[GCC 4.0.1 (Apple Inc. build 5465)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> a = { 'a': 1, 'b': 2, 'c': 3 }
>>> a.items()
[('a', 1), ('c', 3), ('b', 2)]
>>> [(v,k) for (k,v) in a.iteritems()]
[(1, 'a'), (3, 'c'), (2, 'b')]
>>> 

5
以下是Python 3.x 和 Python 2.x 版本之间的不兼容性变更:
对于 Python 3.x,请使用以下方法:
dictlist = []
for key, value in dict.items():
    temp = [key,value]
    dictlist.append(temp)

对于Python 2.7,请使用

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

4
通过字典的keys()values()方法以及zip函数,可以将一个字典转换为一个由元组组成的列表,该列表表现得像一个有序字典。 示例:
>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> zip(d.keys(), d.values())
[('a', 1), ('c', 3), ('b', 2)]
>>> zip(d.values(), d.keys())
[(1, 'a'), (3, 'c'), (2, 'b')]

这对我来说是一个替代方案,比collections.OrderedDict()更适用于多个版本的Python HTTP请求库。尽管我不喜欢zip函数名称有些模糊/过载的问题。 - MarkHu
请注意,“zip”化不是“深度”转换,即如果有嵌套的子元素,它们不会受到影响。您可能需要自己编写递归函数。 - MarkHu

4
>>> a={ 'a': 1, 'b': 2, 'c': 3 }
>>> [(x,a[x]) for x in a.keys() ] # 返回由键值对组成的元组列表,每个元组包含字典a中的一个键和对应的值 [('a', 1), ('c', 3), ('b', 2)]
>>> [(a[x],x) for x in a.keys() ] # 返回由键值对组成的元组列表,每个元组包含字典a中的一个值和对应的键 [(1, 'a'), (3, 'c'), (2, 'b')]

4
一个替代方案是:
list(dictionary.items())  # list of (key, value) tuples
list(zip(dictionary.values(), dictionary.keys()))  # list of (value, key) tuples

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