Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中切换字典中的键和值_Python_Dictionary_Key - Fatal编程技术网

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

在python中切换字典中的键和值,python,dictionary,key,Python,Dictionary,Key,假设我有一本这样的字典: my_dict = {2:3, 5:6, 8:9} 是否有一种方法可以切换键和值以获得: {3:2, 6:5, 9:8} 如果您使用的是python 2.7或3.x,则可以使用字典理解: my_dict2 = {y:x for x,y in my_dict.iteritems()} 编辑 正如JBernardo在评论中指出的,对于python 3.x,您需要使用项而不是iteritems尝试以下方法: my_dict = {2:3, 5:6, 8:9} new_

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

my_dict = {2:3, 5:6, 8:9}
是否有一种方法可以切换键和值以获得:

{3:2, 6:5, 9:8}
如果您使用的是python 2.7或3.x,则可以使用字典理解:

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

正如JBernardo在评论中指出的,对于python 3.x,您需要使用
项而不是
iteritems
尝试以下方法:

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

new_dict = {}
for k, v in my_dict.items():
    new_dict[v] = k
使用以下接受答案中的代码(轻微修改):

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

正如@wim所指出的,它还假设这些值是可散列的。看看你是否不确定什么是可散列的,什么是不可散列的。

也许:


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

有时,值都是唯一的条件将不成立,在这种情况下,上述答案将销毁任何重复值

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

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())])
我确信有更好的(非列表comp)方法,但我对前面的答案有一个问题,所以我想我会提供我的解决方案,以防其他人有类似的用例

另外,不要期望在对原文进行任何更改后,该条仍能保持整齐排列!此方法仅在静态dict上一次性使用-您已收到警告

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

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

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
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']})
从集合导入defaultdict
def reverse_dict(数据:dict)->dict:
rd=defaultdict(列表)
对于data.items()中的k,v:
rd[v].追加(k)
返回路
如果名称=“\uuuuu main\uuuuuuuu”:
从收款进口柜台
data=“aaa bbb ccc ddd aaa bbb ccc aaa”
c=计数器(data.split())
印刷品(c)
#计数器({'aaa':3,'bbb':2,'ccc':2,'ddd':1})
rd=反向指令(c)
印刷品(研发)
#defaultdict(,{3:['aaa'],2:['bbb','ccc'],1:['ddd']})

这可能不安全,因为它依赖于键和值排序,尽管它碰巧对我有用。我喜欢JBernardo/GWW的答案。最好使用
iterkeys
itervalues
,如果在操作过程中不更改dict,这是安全的。我喜欢是因为你没有理解。这些价值观是独一无二的吗?值是可散列的吗?
my_new_dict=dict(zip(my_dict.values(),my_dict.keys())
.iteritems()
在Python 3.x上无效。@JBernardo:修复了,谢谢,我忘了另一个更正-在dic_cols\u w.items()}中执行您建议的词典理解{(y,x)for x,y返回一个集合,不是字典。您仍然需要将其包装在一个
dict(…)
中以获得dictionary@tsando当前位置我想你看错了我的答案。我有
{y:x…
如果值是一个项目列表,并且列表中的每个项目都应该是一个键,你会怎么做?请回答这个问题。
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']}
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']})