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


218

如果我有这样的字典:

{ 'a': 1, 'b': 2, 'c': 3 }

如何将其转换为此?

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

以及如何将其转换为此?

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

7
[tuple(reversed(x)) for x in d.items()]
garej,

1
@garej:鉴于代码中x已经存在a tupleitems生成tuples 的可迭代对象的本质),这样做会更加简单/快捷[x[::-1] for x in d.items()];翻转片直接构造一个反转tuple的适当大小的,而不是具有tuple构造迭代地填入(与过度分配和结束时调整大小)一个tuple从一个reversed迭代器。
ShadowRanger

@ShadowRanger,你是对的。我只是想明确指出,k, v在这种情况下并不总是需要模式。
garej

注:添加compatibility的,因为py2.x // py3.x差异标签
dreftymac

Answers:


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

它不是您想要的顺序,但是字典始终没有任何特定的顺序。1对其进行排序或根据需要进行组织。

参见:items()iteritems()


在Python 3.x中,您将不使用iteritems(不再存在),而使用items,它现在返回字典项目的“视图”。看到什么新的Python 3.0文档,以及新的看法文档

1:在Python 3.7中添加了字典的插入顺序保留


7
items()在python3中返回dict_keys视图。用强制转换包装到列表“ list()”。参见@SilentGhost的回复
Erich

54

因为没有其他人做过,所以我将添加py3k版本:

>>> 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')]

18

您可以使用列表推导。

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

会得到你[ ('a', 1), ('b', 2), ('c', 3) ]

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

另一个例子。

如果愿意,请阅读有关列表理解的更多信息,您可以使用它们来做非常有趣。


10

创建一个namedtuple列表

使用namedtuple通常很方便。例如,您有一个“名称”作为键,而“分数”作为值的字典,例如:

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

您可以将项目列为元组,根据需要进行排序,并获得名称和分数,比如说Python得分最高(index = 0)的玩家非常Python化,如下所示:

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

按值(“分数”)排序:

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

你想要的是dictitems()iteritems()方法。items返回(键,值)元组的列表。由于元组是不可变的,因此它们不能反转。因此,您必须迭代这些项并创建新的元组,以获取反转的(值,键)元组。对于迭代而言,iteritems是首选方法,因为它使用生成器来生成(键,值)元组,而不必将整个列表保留在内存中。

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的重大变化

对于Python3.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
>>> a = {'a':1,'b':2,'c':3}

>>> [[x,a [x])for a.keys()中的x]
[('a',1),('c',3),('b',2)]

>>> [[(a [x],x)for a.keys()中的x]
[(1,'a'),(3,'c'),(2,'b')]

4

通过keys()values()字典的方法和zip

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 Requests lib一起使用。即使我不喜欢zip函数名称过于模糊/重载。
MarkHu

请注意,zip-ification不是“深层”转换,即,如果有嵌套的子代,则它们不会受到影响。您可能必须滚动自己的递归。
MarkHu

3
d = {'John':5, 'Alex':10, 'Richard': 7}
list = []
for i in d:
   k = (i,d[i])
   list.append(k)

print list

2
尽管此代码可能有助于解决问题,但并未解释为什么和/或如何回答问题。提供这种额外的环境将大大提高其长期教育价值。请编辑您的答案以添加解释,包括适用的限制和假设。
Toby Speight,

2

一个简单的是

list(dictionary.items())  # list of (key, value) tuples
list(zip(dictionary.values(), dictionary.keys()))  # list of (key, value) tuples

第二个不是更简单,而是。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.