说我有这样的字典:
my_dict = {2:3, 5:6, 8:9}
有没有办法可以切换键和值来获取:
{3:2, 6:5, 9:8}
答案 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']})