在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']})