【问题标题】:switching keys and values in a dictionary in python [duplicate]在python中的字典中切换键和值[重复]
【发布时间】: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()))怎么样

标签: python dictionary key


【解决方案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']})
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2019-06-17
                • 2019-04-15
                • 2019-06-22
                • 2019-02-05
                • 2013-04-13
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多