在 python 中切换字典中的键和值

假设我有一本这样的字典:

my_dict = {2:3, 5:6, 8:9}

有没有一种方法,我可以切换键和值得到:

{3:2, 6:5, 9:8}
113641 次浏览

对于 Python 3:

my_dict2 = {y: x for x, y in my_dict.items()}

对于 Python 2,您可以使用

my_dict2 = dict((y, x) for x, y in my_dict.iteritems())

试试这个:

my_dict = {2:3, 5:6, 8:9}


new_dict = {}
for k, v in my_dict.items():
new_dict[v] = k

使用 Python 反转/反转映射中已接受的答案中的代码(稍作修改) :

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

注意,这里假设原始字典中的值是唯一的。否则,最终结果字典中将出现重复的键,这是不允许的。

而且,正如@wim 所指出的,它还假设这些值是散列的。如果您不确定什么是散列的,什么是不散列的,请参阅 巨蟒词汇表

也许:

flipped_dict = dict(zip(my_dict.values(), my_dict.keys()))

my_dict = { my_dict[k]:k for k in my_dict}

有时,所有值都是唯一的条件不成立,在这种情况下,上面的答案会破坏任何重复的值。

下面将可能重复的值滚动到列表中:

from itertools import count
dict([(a,[list(d.keys())[i] for i,j in zip(count(), d.values())if j==a in set(d.values())])

我确信有一个更好的(非 list-comp)方法,但是我对前面的答案有一个问题,所以认为我应该提供我的解决方案,以防其他人也有类似的用例。

附注: 不要指望在对原文进行任何修改之后,字典还能保持整齐的排列!这种方法是一次性使用,只对静态字典-您已经得到警告!

首先,没有保证这是可能的,因为字典的值是不可散列的。

如果不是这样,我们可以使用函数方法:

reversed_dict = dict(map(reversed, original_dict.items()))

如果值不是唯一的,这将在转换中碰撞键空间。 最好是在交换位置时把钥匙放在列表中

下面的处理这-

RvsD = dict()
for k,v in MyDict.iteritems():
RsvD.setdefault(v, []).append(k)

你可以这样做:

功能:

def inverse_dict(my_dict):
updated_dict = {}


for i in my_dict:
updated_dict[my_dict[i]] = [i]


return updated_dict

主要() :

def main():
year = {'day': 15, 'month': 3, 'year': 2019}
print(inverse_dict(year))


if __name__ == "__main__":
main()

输出:

{15: ['day'], 3: ['month'], 2019: ['year']}

如果值在字典中不是唯一的,则可以将键映射到该值。这里有一个如何使用 defaultdict 的示例

from collections import defaultdict




def reverse_dict(data: dict) -> dict:
rd = defaultdict(list)
for k, v in data.items():
rd[v].append(k)
return rd




if __name__ == "__main__":
from collections import Counter


data = "aaa bbb ccc ddd aaa bbb ccc aaa"
c = Counter(data.split())
print(c)
# Counter({'aaa': 3, 'bbb': 2, 'ccc': 2, 'ddd': 1})
rd = reverse_dict(c)
print(rd)
# defaultdict(<class 'list'>, {3: ['aaa'], 2: ['bbb', 'ccc'], 1: ['ddd']})