我是通过python导师运行此代码的,只是对键和值的切换方式感到困惑。我还对handler
对应的值感到困惑,因为我不确定myDict[d[key]]
中的d
的实际作用。
[d[key]]
答案 0 :(得分:1)
函数d
中正在传入的字典。您的代码正在创建一个新字典,将另一个方向映射(从原始字典的值到其键)。由于可能没有一对一的映射(因为可以在字典中重复值),所以新的映射实际上是从值到键列表。
当代码在d
中的键上循环时,它随后使用d[key]
查找相应的值。正如我在上面评论的那样,这实际上并不是解决此问题的最有效方法。您可以代替遍历字典的items()
并在循环中获取key, value
2元组,而不是先获取键并进行索引以获得值。
这是我重写函数的方式,我认为这是一种更清晰的方式(也许效率更高):
def dict_invert(d):
myDict = {}
for key, value in d.items(): # Get both key and value in the iteration.
if value in myDict: # That change makes these later lines more clear,
myDict[value].append(key) # as they can use value instead of d[key].
else:
myDict[value] = [key] # here too
for val in myDict.values():
val.sort()
return myDict
答案 1 :(得分:1)
您正在显示的功能会倒置字典d
。字典是唯一键的集合,这些键映射到不一定唯一的值。这意味着当您交换键和值时,您可能会获得具有相同值的多个键。您的函数通过将输入中的键添加到相反的列表中来处理此问题,而不是将它们直接存储为值。这样可以避免发生任何冲突。
让我们先从概念上看一下样本,然后再进行深入研究。假设您拥有
d = {
'a': 1,
'b': 1,
'c': 2
}
将其反转时,将具有键1
和2
。键1
将具有两个值:'a'
和'b'
。键2
仅具有一个值:'c'
。我为键和值使用了不同的类型,因此当您查看输入与输出时,您可以立即知道。输出应如下所示:
myDict = {
1: ['a', 'b'],
2: ['c']
}
现在让我们看一下代码。首先,您初始化一个空输出:
myDict = {}
然后您逐步浏览输入d
中的每个键。请记住,这些键将成为输出的值:
for key in d.keys():
d
在key
中的值为d[key]
。您需要检查这是否是myDict
中的 key ,因为值成为相反的键:
if d[key] in myDict:
如果输入的值已经是myDict
中的键,则它映射到d
中的键列表,您需要在列表中追加另一个。具体来说,d[key]
表示d
中键key
的值。此值成为myDict
中的键,这就是为什么要像这样对其进行索引的原因:
myDict[d[key]].append(key)
否则,创建一个新列表,其中记录单个逆:
else:
myDict[d[key]] = [key]
最后一步是对逆值进行排序。这不一定是一个好主意。这些值是输入中的键,因此保证它们是可哈希的,但不一定彼此可比:
for val in myDict.values():
val.sort()
以下应在Python 3中引发错误:
dict_invert({(1, 2): 'a', 3: 'b'})
答案 2 :(得分:0)
myDict[d[key]]
取值为d[key]
并将其用作myDict
中的键,例如
d = {'a': 'alpha', 'b': 'beta'}
D = {'alpha': 1, 'beta': 2}
D[d['a']] = 3
D[d['b']] = 4
现在d
和D
的内容应如下所示
d = {'a': 'alpha', 'b': 'beta'}
D = {'alpha': 3, 'beta': 4}
答案 3 :(得分:0)
d
是您要传递给函数的字典
def dict_invert(d)
创建时
myDict[d[key]] = d
它的意思是
myDict[value of d] = key of d
产生
myDict = {'value of d': 'key of d'}