在python中的字典中切换键和值[重复]

Posted

技术标签:

【中文标题】在python中的字典中切换键和值[重复]【英文标题】:switching keys and values in a dictionary in python [duplicate] 【发布时间】:2012-01-08 11:35:50 【问题描述】:

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

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

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

3:2, 6:5, 9:8

【问题讨论】:

值是否唯一?这些值是可散列的吗? my_new_dict = dict(zip(my_dict.values(), my_dict.keys()))怎么样 【参考方案1】:
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 在 cmets 中所述,对于 python 3.x,您需要使用 items 而不是 iteritems

【讨论】:

.iteritems() 在 Python 3.x 上无效... @JBernardo:解决了,谢谢,我忘了 另一个更正 - 执行您建议的字典理解 (y, x) for x, y in dic_cols_w.items() 返回一个集合,而不是字典。您仍然需要将其包装在 dict(...) 中以获取字典 @tsando:我认为你读错了我的答案。我有y:x ... 如果值是一个项目列表并且列表中的每个项目都应该是一个键,你会怎么做?【参考方案2】:
my_dict =  my_dict[k]:k for k in my_dict

【讨论】:

清理回答这个。【参考方案3】:

试试这个:

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

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

【讨论】:

【参考方案4】:

使用Python reverse / invert a mapping 接受的答案中的此代码(稍作修改):

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

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

而且,正如@wim 指出的那样,它还假设这些值是可散列的。如果您不确定什么是可散列的和不可散列的,请参阅 the Python glossary。

【讨论】:

【参考方案5】:

也许:

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

【讨论】:

这可能不安全,因为它依赖于键和值排序,尽管它碰巧对我有用。我喜欢 JBernardo/GWW 的回答。 使用iterkeysitervalues可能会更好 如果在操作过程中不更改dict,那是安全的。我喜欢,因为你没有理解就这样做了。【参考方案6】:

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

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

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

【讨论】:

【参考方案7】:

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

以下将可能重复的值汇总到一个列表中:

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())])

我确定有更好的(非列表组合)方法,但我对早期的答案有疑问,所以我想我会提供我的解决方案,以防其他人有类似的用例。

附:不要指望 dict 在对原作进行任何更改后仍能保持整齐排列!此方法只能在静态字典上一次性使用 - 您已被警告!

【讨论】:

【参考方案8】:

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

下面处理这个 -

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

【讨论】:

【参考方案9】:

你可以这样做:

功能:

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']

【讨论】:

【参考方案10】:

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

【讨论】:

以上是关于在python中的字典中切换键和值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Map里面的键和值可以为空吗

使用 min 从字典中获取最低键和值 [重复]

Python3基础 dict keys+values 循环打印字典中的所有键和值

Python3基础 dict keys+values 循环打印字典中的所有键和值

如何从一系列字典中创建键和值的数据框[重复]

从python字典如何将键和值保存到* .txt文件[关闭]