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

Python 如何将字典转换为元组列表?,python,list,compatibility,iterable-unpacking,Python,List,Compatibility,Iterable Unpacking,如果我有一本字典,比如: { 'a': 1, 'b': 2, 'c': 3 } 我怎样才能把它转换成这个 [ ('a', 1), ('b', 2), ('c', 3) ] [ (1, 'a'), (2, 'b'), (3, 'c') ] 我怎样才能把它转换成这个呢 [ ('a', 1), ('b', 2), ('c', 3) ] [ (1, 'a'), (2, 'b'), (3, 'c') ] 这不是你想要的顺序,但是dicts没有任何特定的顺序。1根据需要对它进行排序或组织 见:

如果我有一本字典,比如:

{ 'a': 1, 'b': 2, 'c': 3 }
我怎样才能把它转换成这个

[ ('a', 1), ('b', 2), ('c', 3) ]
[ (1, 'a'), (2, 'b'), (3, 'c') ]
我怎样才能把它转换成这个呢

[ ('a', 1), ('b', 2), ('c', 3) ]
[ (1, 'a'), (2, 'b'), (3, 'c') ]
这不是你想要的顺序,但是dicts没有任何特定的顺序。1根据需要对它进行排序或组织

见:


在Python3.x中,您将不使用
iteritems
(不再存在),而是使用
items
,它现在将“视图”返回到字典项中。请参阅Python3.0的文档和新版本

1:dicts的插入顺序保留为


您需要的是
dict
items()
iteritems()
方法<代码>项返回(键、值)元组的列表。由于元组是不可变的,所以它们不能反转。因此,您必须迭代这些项并创建新的元组以获得反向(值、键)元组。对于迭代,
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')]
>>> 

您可以使用列表理解

[(k,v) for k,v in a.iteritems()] 
您将获得
[('a',1),('b',2),('c',3)]

[(v,k) for k,v in a.iteritems()] 
另一个例子

如果你喜欢,你可以用它们做什么很有趣

>>> a={ 'a': 1, 'b': 2, 'c': 3 } >>> [(x,a[x]) for x in a.keys() ] [('a', 1), ('c', 3), ('b', 2)] >>> [(a[x],x) for x in a.keys() ] [(1, 'a'), (3, 'c'), (2, 'b')] >>>a={'a':1,'b':2,'c':3} >>>[(x,a[x])表示a.keys()中的x [('a',1),('c',3),('b',2)] >>>[(a[x],x)表示a.keys()中的x] [(1,'a'),(3,'c'),(2,'b')]
由于没有其他人这样做,我将添加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')]
创建一个名为tuples的列表

它通常使用起来非常方便。例如,您有一个字典,其中“name”作为键,“score”作为值,如:

d = {'John':5, 'Alex':10, 'Richard': 7}
您可以将这些项目列为元组,如果愿意,可以进行排序,并获取其名称和分数,比如说分数最高(index=0)的玩家非常像这样:

>>> player = best[0]

>>> player.name
        'Alex'
>>> player.score
         10
如何做到这一点:

按随机顺序或保持顺序列出:

按顺序,按值(“分数”)排序:

首先以最低分数排序:

worst = sorted(Player(v,k) for (k,v) in d.items())
best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)
首先以最高分数排序:

worst = sorted(Player(v,k) for (k,v) in d.items())
best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)
通过
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')]

这些是Python3.x和Python2.x的突破性变化

用于Python3.x

dictlist = []
for key, value in dict.items():
    temp = [key,value]
    dictlist.append(temp)
对于Python2.7,请使用

dictlist = []
for key, value in dict.iteritems():
    temp = [key,value]
    dictlist.append(temp)
更简单的方法是

list(dictionary.items())  # list of (key, value) tuples
list(zip(dictionary.values(), dictionary.keys()))  # list of (key, value) tuples
Python3
dict.values()
不返回列表。这就是一个例子

mydict = {
  "a": {"a1": 1, "a2": 2},
  "b": {"b1": 11, "b2": 22}
}

print(mydict.values())
> output: dict_values([{'a1': 1, 'a2': 2}, {'b1': 11, 'b2': 22}])

print(type(mydict.values()))
> output: <class 'dict_values'>

print(list(mydict.values()))
> output: [{'a1': 1, 'a2': 2}, {'b1': 11, 'b2': 22}]

print(type(list(mydict.values())))
> output: <class 'list'>
mydict={
“a”:{“a1”:1,“a2”:2},
“b”:{“b1”:11,“b2”:22}
}
打印(mydict.values())
>输出:dict_值([{'a1':1,'a2':2},{'b1':11,'b2':22})
打印(键入(mydict.values())
>输出:
打印(列表(mydict.values())
>输出:[{'a1':1,'a2':2},{'b1':11,'b2':22}]
打印(类型(列表(mydict.values()))
>输出:

“[(k,v)for(k,v)in d.iteritems()]”与d.items()是一个可怕的等价物。这对我来说是
collections.orderedict()
的替代品,它可以更好地处理多个版本的Python HTTP请求库。尽管我不喜欢
zip
函数名,因为它有点模糊/重载。请注意
zip
-ification不是一个“深层”转换,即如果有嵌套的子级,它们不会受到影响。您可能需要使用自己的递归。虽然这段代码可能有助于解决问题,但它没有解释为什么和/或如何回答这个问题。提供这种额外的环境将大大提高其长期教育价值。请在回答中添加解释,包括适用的限制和假设。items()在python3中返回dict_keys视图。使用对列表“list()”的强制转换包装此调用。请参见@SilentGhost的回复
[tuple(反转(x)],了解d.items()中的x
@garej:Given
x
已经是代码中的
元组了(根据
items
的性质,生成
tuple
的一个可数),只需对d.items()中的x执行
[x[::-1]会更简单/更快;反向切片直接构造一个大小合适的反向
元组
,而不是让
元组
构造函数从一个
反向
迭代器迭代地填充一个
元组
。@ShadowRanger,你说得对。我只是想明确指出,在这种情况下并不总是需要
k,v
模式
list(dictionary.items())  # list of (key, value) tuples
list(zip(dictionary.values(), dictionary.keys()))  # list of (key, value) tuples
mydict = {
  "a": {"a1": 1, "a2": 2},
  "b": {"b1": 11, "b2": 22}
}

print(mydict.values())
> output: dict_values([{'a1': 1, 'a2': 2}, {'b1': 11, 'b2': 22}])

print(type(mydict.values()))
> output: <class 'dict_values'>

print(list(mydict.values()))
> output: [{'a1': 1, 'a2': 2}, {'b1': 11, 'b2': 22}]

print(type(list(mydict.values())))
> output: <class 'list'>