假设我有一本这样的字典:
my_dict = {2:3, 5:6, 8:9}
有没有一种方法,我可以切换键和值得到:
{3:2, 6:5, 9:8}
对于 Python 3:
my_dict2 = {y: x for x, y in my_dict.items()}
对于 Python 2,您可以使用
my_dict2 = dict((y, x) for x, y in my_dict.iteritems())
试试这个:
my_dict = {2:3, 5:6, 8:9} new_dict = {} for k, v in my_dict.items(): new_dict[v] = k
使用 Python 反转/反转映射中已接受的答案中的代码(稍作修改) :
dict((v,k) for k, v in my_dict.iteritems())
注意,这里假设原始字典中的值是唯一的。否则,最终结果字典中将出现重复的键,这是不允许的。
而且,正如@wim 所指出的,它还假设这些值是散列的。如果您不确定什么是散列的,什么是不散列的,请参阅 巨蟒词汇表。
也许:
flipped_dict = dict(zip(my_dict.values(), my_dict.keys()))
my_dict = { my_dict[k]:k for k in my_dict}
有时,所有值都是唯一的条件不成立,在这种情况下,上面的答案会破坏任何重复的值。
下面将可能重复的值滚动到列表中:
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())])
我确信有一个更好的(非 list-comp)方法,但是我对前面的答案有一个问题,所以认为我应该提供我的解决方案,以防其他人也有类似的用例。
附注: 不要指望在对原文进行任何修改之后,字典还能保持整齐的排列!这种方法是一次性使用,只对静态字典-您已经得到警告!
首先,没有保证这是可能的,因为字典的值是不可散列的。
如果不是这样,我们可以使用函数方法:
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
主要() :
def main(): year = {'day': 15, 'month': 3, 'year': 2019} print(inverse_dict(year)) if __name__ == "__main__": 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']})