如果我有一个字典,例如:
{'a': 1, 'b': 2, 'c': 3}
我该如何将它转换成这样?
[('a', 1), ('b', 2), ('c', 3)]
我该如何将它转换为这种格式?
[(1, 'a'), (2, 'b'), (3, 'c')]
{'a': 1, 'b': 2, 'c': 3}
我该如何将它转换成这样?
[('a', 1), ('b', 2), ('c', 3)]
我该如何将它转换为这种格式?
[(1, 'a'), (2, 'b'), (3, 'c')]
>>> d = { 'a': 1, 'b': 2, 'c': 3 }
>>> list(d.items())
[('a', 1), ('c', 3), ('b', 2)]
从 Python 3.6 开始,列表的顺序是可以预期的。
在 Python 2 中,您不需要使用list
。
既然没有人做了,我来添加一下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')]
[(k,v) for k,v in a.iteritems()]
使用[( 'a', 1 ), ( 'b', 2 ), ( 'c', 3 )]
将会得到:
[(v,k) for k,v in a.iteritems()]
另一个例子。
如果你愿意,可以阅读更多关于列表解析的内容,你会发现它们非常有趣。
创建具有命名元组的列表
使用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)
[(k,v) for (k,v) in d.iteritems()]
并且
[(v,k) for (k,v) in d.iteritems()]
dict
的 items()
和 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')]
>>>
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)
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>>> 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')]
list(dictionary.items()) # list of (key, value) tuples
list(zip(dictionary.values(), dictionary.keys())) # list of (value, key) tuples
[tuple(reversed(x)) for x in d.items()]
- garejx
已经是一个元组(这是items
产生元组可迭代对象的特性),更简单/更快的方法是直接使用[x[::-1] for x in d.items()]
;反转切片直接构造了一个逆序的正确大小的元组,而不是使用元组构造器从反向迭代器中迭代填充(最后进行过度分配和调整大小)一个元组。 - ShadowRangerk, v
模式。 - garej