扭转一个字典

时间:2014-12-08 23:14:17

标签: python for-loop dictionary

我目前正在尝试创建一个可以反转dict键和值的函数。我在网上看到并发现了这个:

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

我的问题是我不确定这意味着什么。我理解单行上的for循环的想法,但我不确定k,v的(v,k)如何导致键和值被反转。有人可以帮我一把。 (我在网上和Stack Overflow都搜索过这个,但找不到任何东西。)

3 个答案:

答案 0 :(得分:4)

for k, v in d.iteritems()分别为key kvalue v,因此使用(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}

您可能遇到的两个问题是重复值或不可清除的值,因此它们不能用作列表,集等等的键...

In [5]: d = {1:2,2:2}

In [6]: new_d = {v:k for k,v in d.iteritems()}

In [7]: new_d
Out[7]: {2: 2} # now only one key and value in the dict

In [8]: d = {1:2,2:[2]}

In [9]: new_d = {v:k for k,v in d.iteritems()}
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-9-46a3901ce850> in <module>()
----> 1 new_d = {v:k for k,v in d.iteritems()}

<ipython-input-9-46a3901ce850> in <dictcomp>((k, v))
----> 1 new_d = {v:k for k,v in d.iteritems()}

TypeError: unhashable type: 'list'

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

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

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

答案 1 :(得分:1)

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

这就是为什么(v,k)被反转,如果你没有反转它们,就像这样

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

你会得到一个相同的字典。

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

{v:k for k,v in d.items()}

更直观地读取(至少对我来说),因为它看起来更像是列表理解,只是它创建了一个字典。

答案 2 :(得分:1)

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

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

然后你可以使用Python将元组中的每个项目分配给一个单独的变量 元组解包语法:

a, b = (1, 2)
print(a)  # 1
print(b)  # 2

如果您将元组列表传递给dict(),它会将它们视为列表 (key, value)个项目:

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

最后,您发布的示例使用了Python的列表推导 语法:

item_list = ['item' + str(n) for n in range(1, 6)]
print(item_list)

要了解您发布的代码段,您只需要这样做 熟悉这些Python习语。如果您还没有看到任何 在此之前,这些技术是一个相当密集的爆发 了解新信息。