当值是列表且项不唯一时,交换字典键和值

时间:2018-03-29 14:03:21

标签: python dictionary key

设置向上

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

字典看起来像,

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'}

如何计算非唯一值并且不丢失信息?

4 个答案:

答案 0 :(得分:3)

一种方法是使用collections.defaultdict

    public class TreeItem : PropertyChangedBase
    {
        private string name;
        public string Name
        {
            get => name;
            set
            {
                name = value;
                NotifyOfPropertyChange(() => Name);
            }
        }

        public ObservableCollection<TreeItem> Children { get; } = new ObservableCollection<TreeItem>();
    }

答案 1 :(得分:1)

使用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']}

答案 2 :(得分:1)

有人回答了这个问题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']}

答案 3 :(得分:0)

您还可以使用词典理解:

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']}
相关问题