我目前正在尝试创建一个可以反转dict键和值的函数。我在网上看到并发现了这个:
def reverse(d):
return dict([(v, k) for k, v in d.iteritems()])
我的问题是我不确定这意味着什么。我理解单行上的for循环的想法,但我不确定k,v的(v,k)如何导致键和值被反转。有人可以帮我一把。 (我在网上和Stack Overflow都搜索过这个,但找不到任何东西。)
答案 0 :(得分:4)
for k, v in d.iteritems()
分别为key k
和value 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习语。如果您还没有看到任何 在此之前,这些技术是一个相当密集的爆发 了解新信息。