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

时间:2011-11-29 03:36:47

标签: python dictionary key

说我有这样的字典:

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

有没有办法可以切换键和值来获取:

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

10 个答案:

答案 0 :(得分:67)

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

如果您使用的是python 2.7或3.x,则可以使用词典理解:

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

修改

如JBernardo的评论中所述,对于python 3.x,您需要使用items代替iteritems

答案 1 :(得分:6)

试试这个:

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

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

答案 2 :(得分:6)

Python reverse / invert a mapping

的接受答案中使用此代码(经过简单修改)
dict((v,k) for k, v in my_dict.iteritems())

请注意,这假定原始字典中的值是唯一的。否则,您最终会在结果字典中出现重复键,这是不允许的。

并且,正如@wim指出的那样,它还假设值是可清除的。如果您不确定什么是不可用的,请参阅the Python glossary

答案 3 :(得分:5)

也许:

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

答案 4 :(得分:2)

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

以下内容将可能重复的值滚动到列表中:

{{1}}

我确定有更好的(非列表补偿)方法,但我对之前的答案有疑问,所以我想提供我的解决方案以防其他人有类似的问题用例。

P.S。在对原版进行任何更改之后,不要期望这个dict保持整齐排列!此方法仅在静态字典上一次性使用 - 您已收到警告!

答案 5 :(得分:1)

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

答案 6 :(得分:1)

首先,保证这是可能的,因为字典的值可能是不可用的。

如果不是,我们可以使用功能方法:

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

答案 7 :(得分:1)

如果值不是唯一的,这将冲突转换中的键空间。 最好是在切换位置时将按键保留在列表中

以下处理-

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

答案 8 :(得分:1)

您可以这样做:

功能:

def inverse_dict(my_dict):
    updated_dict = {}

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

return updated_dict

Main():

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

if __name__ == "__main__":
    main()

输出:

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

答案 9 :(得分:0)

如果值在词典中不是唯一的,则可以将键映射到该值。这里是一个如何使用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']})