【问题标题】:Swap dictionary keys and values, when values are lists and items are not unique当值是列表且项目不唯一时,交换字典键和值
【发布时间】:2018-03-29 14:03:21
【问题描述】:

设置

我有一个大字典,列表中有唯一键、唯一值和非唯一值。

字典看起来像,

d = {'a': ['1','2','3'],'b': ['1'],'c': ['1','3']}

问题

我想交换键和值,

d_inverse = {'1': ['a', 'b', 'c'], '2': ['a'],'3': ['a', 'c']}

我找到了以下关于交换键和值的答案,

关于用列表中的值交换键,

最后一个答案很接近,但不管理列表中的非唯一值。

也就是说,

{k: oldk for oldk, oldv in d.items() for k in oldv}

产生

{'1': 'c', '2': 'a', '3': 'c'}

我如何考虑非唯一值并且不丢失信息?

【问题讨论】:

  • 考虑使用循环?
  • 请注意,d 的列表中有 intstring 值,因此您的输出不太正确(它应该同时具有 '1'1 键) .
  • 谢谢,我编辑了我的例子。

标签: python dictionary key


【解决方案1】:

一种方法是使用collections.defaultdict

d = {'a': ['1','2','3'],'b': ['1'],'c': ['1','3']}

from collections import defaultdict
d_dict = defaultdict(list)
for k,v in d.items():
    for i in v:
        d_dict[i].append(k)

dict(d_dict)
#{'1': ['a', 'b', 'c'], '2': ['a'], '3': ['a', 'c']}

【讨论】:

    【解决方案2】:

    使用for-loop

    d = {'a': ['1','2','3'],'b': [1],'c': ['1','3']}
    res = {}
    
    for k,v in d.items():           #Iterate dictionary.
        for i in v:                 #Iterate List
            i = str(i)              #Convert element to string
            if i not in res:        #Check if key in dictionary.
                res[i] = [k]
            else:
                res[i].append(k)    #Else append element. 
    print(res)
    

    输出:

    {'1': ['a', 'c', 'b'], '3': ['a', 'c'], '2': ['a']}
    

    【讨论】:

      【解决方案3】:

      有人回答了这个问题here

      inv_map = {}
      for k, v in my_map.iteritems():
          inv_map.setdefault(v, []).append(k)
      

      只要稍加改动,它就可以按照我们的意愿工作:

      d = {'a': ['1','2','3'],'b': ['1'],'c': ['1','3']}
      
      inv_map = {}
      for k, vs in d.items():
          for v in vs:
              inv_map.setdefault(v, []).append(k)
      
      
      print(inv_map)
      >>> {'1': ['a', 'b', 'c'], '2': ['a'], '3': ['a', 'c']}
      

      【讨论】:

      • 谢谢马丁。我找到了那个,但没有用。 list 不可散列。
      【解决方案4】:

      您也可以使用字典推导:

      from string import ascii_lowercase as alphabet
      d = {'a': ['1','2','3'],'b': ['1'],'c': ['1','3']}
      new_d = {str(alphabet.index(a)+1):[alphabet[int(i)-1] for i in b] for a, b in d.items()}
      

      输出:

      {'1': ['a', 'b', 'c'], '2': ['a'], '3': ['a', 'c']}
      

      【讨论】:

        猜你喜欢
        • 2015-10-18
        • 2021-08-04
        • 1970-01-01
        • 1970-01-01
        • 2015-09-05
        • 1970-01-01
        • 1970-01-01
        • 2022-11-18
        • 2015-10-18
        相关资源
        最近更新 更多