反转Di

2024-05-02 15:54:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试做一个函数,它可以反转dict的键和值。我在网上找的时候发现了这个:

def reverse(d):
    return dict([(v, k) for k, v in d.iteritems()])

我的问题是我不知道这意味着什么。我理解在单行上使用for循环的思想,但我不确定(v,k)for k,v如何导致键和值被反转。有人能帮帮我吗。(我确实在网上和堆栈溢出上搜索过这个,但找不到任何东西。)


Tags: 函数inforreturn堆栈defdictreverse
3条回答

for k, v in d.iteritems()分别是key k和{},因此用(v, k)反转v和k使旧值成为键,旧键成为新值

In [7]: d = {1:10,2:20}

In [8]: d.items()
Out[8]: dict_items([(1, 10), (2, 20)]) # tuples of key and value

 In [1]: d = {1:10,2:20}

In [2]: for k,v in d.iteritems():
           print k,v
   ...:     
1 10 # 1 is the key 10 is the value
2 20
In [3]: new_d = {v:k for k,v in d.iteritems()} # swap key for value and value for key

In [4]: new_d
Out[4]: {10: 1, 20: 2}

您可能遇到的两个问题是重复的值或不可散列的值,因此它们不能用作列表、集合等键。。。在

^{pr2}$

dict([(v, k) for k, v in d.iteritems()])将与{v:k for k,v in d.iteritems()}具有相同的输出,主要区别是前者还与python<;2.7兼容。在

如果您使用的是python<;2.7,则无需使用列表,您只需使用生成器表达式:

dict((v, k) for k, v in d.iteritems())

dict构造函数可以接收一个iterable的键/值对来创建字典,因此这段代码是说“从这个字典d中获取键/值对,并创建一个新字典,其中d的值现在是键,d的键成为值”

这就是为什么(v,k)是颠倒的,如果你没有颠倒它们,像这样

 def reverse(d):
    return dict([(k, v) for k, v in d.iteritems()])

你会得到一本一模一样的字典。在

另请注意,在python 2.7及更高版本中,您实际上可以使用更紧凑的:

^{pr2}$

它读起来更直观(至少对我来说),因为它看起来更像是一个列表理解,只不过它创建了一个dict

好的,所以当你在dict上调用iteritems()时,它会为字典中的每个项目提供一个(key, value)元组:

for item in d.iteritems():
    print(item)

然后可以使用Python的 元组解包语法:

^{pr2}$

{把它们当作一个列表来处理 (key, value)项:

eg_dict = dict([(a, 4), (b, 6)])
print(eg_dict)

最后用Python的例子来理解 语法:

^{4}$

要理解您发布的代码片段,您只需 熟悉这些Python习语。如果你没有看到任何 在这些技术中,这是一个相当密集的爆发 新的信息让你头脑清醒。在

相关问题 更多 >